MINOR: flags/task: use flag dumping for task state

The new function is task_show_state().
diff --git a/dev/flags/flags.c b/dev/flags/flags.c
index 46936a3..c24bde8 100644
--- a/dev/flags/flags.c
+++ b/dev/flags/flags.c
@@ -84,33 +84,8 @@
 
 void show_task_state(unsigned int f)
 {
-	printf("task->state = ");
-
-	if (!f) {
-		printf("TASK_SLEEPING\n");
-		return;
-	}
-
-	SHOW_FLAG(f, TASK_F_USR1);
-	SHOW_FLAG(f, TASK_F_TASKLET);
-	SHOW_FLAG(f, TASK_WOKEN_OTHER);
-	SHOW_FLAG(f, TASK_WOKEN_RES);
-	SHOW_FLAG(f, TASK_WOKEN_MSG);
-	SHOW_FLAG(f, TASK_WOKEN_SIGNAL);
-	SHOW_FLAG(f, TASK_WOKEN_IO);
-	SHOW_FLAG(f, TASK_WOKEN_TIMER);
-	SHOW_FLAG(f, TASK_WOKEN_INIT);
-	SHOW_FLAG(f, TASK_HEAVY);
-	SHOW_FLAG(f, TASK_IN_LIST);
-	SHOW_FLAG(f, TASK_KILLED);
-	SHOW_FLAG(f, TASK_SELF_WAKING);
-	SHOW_FLAG(f, TASK_QUEUED);
-	SHOW_FLAG(f, TASK_RUNNING);
-
-	if (f) {
-		printf("EXTRA(0x%08x)", f);
-	}
-	putchar('\n');
+	task_show_state(tmpbuf, sizeof(tmpbuf), " | ", f);
+	printf("task->state = %s\n", tmpbuf);
 }
 
 void show_txn_flags(unsigned int f)
diff --git a/include/haproxy/task-t.h b/include/haproxy/task-t.h
index 06d7f22..4dd10f4 100644
--- a/include/haproxy/task-t.h
+++ b/include/haproxy/task-t.h
@@ -27,9 +27,12 @@
 #include <import/ebtree-t.h>
 
 #include <haproxy/api-t.h>
+#include <haproxy/show_flags-t.h>
 #include <haproxy/thread-t.h>
 
-/* values for task->state (32 bits) */
+/* values for task->state (32 bits).
+ * Please also update the task_show_state() function below in case of changes.
+ */
 #define TASK_SLEEPING     0x00000000  /* task sleeping */
 #define TASK_RUNNING      0x00000001  /* the task is currently running */
 /* unused                 0x00000002 */
@@ -61,6 +64,27 @@
 #define TASK_PERSISTENT   (TASK_SELF_WAKING | TASK_KILLED | \
                            TASK_HEAVY | TASK_F_TASKLET | TASK_F_USR1)
 
+/* This function is used to report state in debugging tools. Please reflect
+ * below any single-bit flag addition above in the same order via the
+ * __APPEND_FLAG macro. The new end of the buffer is returned.
+ */
+static forceinline char *task_show_state(char *buf, size_t len, const char *delim, uint flg)
+{
+#define _(f, ...) __APPEND_FLAG(buf, len, delim, flg, f, #f, __VA_ARGS__)
+	/* prologue */
+	_(0);
+	/* flags */
+	_(TASK_RUNNING, _(TASK_QUEUED, _(TASK_SELF_WAKING,
+	_(TASK_KILLED, _(TASK_IN_LIST, _(TASK_HEAVY, _(TASK_WOKEN_INIT,
+	_(TASK_WOKEN_TIMER, _(TASK_WOKEN_IO, _(TASK_WOKEN_SIGNAL,
+	_(TASK_WOKEN_MSG, _(TASK_WOKEN_RES, _(TASK_WOKEN_OTHER,
+	_(TASK_F_TASKLET, _(TASK_F_USR1)))))))))))))));
+	/* epilogue */
+	_(~0U);
+	return buf;
+#undef _
+}
+
 /* these wakeup types are used to indicate how a task/tasklet was woken up, for
  * debugging purposes.
  */