REORG: include: move task.h to haproxy/task{,-t}.h

The TASK_IS_TASKLET() macro was moved to the proto file instead of the
type one. The proto part was a bit reordered to remove a number of ugly
forward declaration of static inline functions. About a tens of C and H
files had their dependency dropped since they were not using anything
from task.h.
diff --git a/include/haproxy/dns-t.h b/include/haproxy/dns-t.h
index 54c58ee..832016b 100644
--- a/include/haproxy/dns-t.h
+++ b/include/haproxy/dns-t.h
@@ -30,7 +30,7 @@
 
 #include <types/connection.h>
 #include <haproxy/proto_udp-t.h>
-#include <types/task.h>
+#include <haproxy/task-t.h>
 
 extern struct pool_head *dns_requester_pool;
 
diff --git a/include/types/task.h b/include/haproxy/task-t.h
similarity index 96%
rename from include/types/task.h
rename to include/haproxy/task-t.h
index 6515d46..11f0cb6 100644
--- a/include/types/task.h
+++ b/include/haproxy/task-t.h
@@ -1,5 +1,5 @@
 /*
- * include/types/task.h
+ * include/haproxy/task-t.h
  * Macros, variables and structures for task management.
  *
  * Copyright (C) 2000-2010 Willy Tarreau - w@1wt.eu
@@ -19,16 +19,18 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef _TYPES_TASK_H
-#define _TYPES_TASK_H
+#ifndef _HAPROXY_TASK_T_H
+#define _HAPROXY_TASK_T_H
 
 #include <sys/time.h>
 
-#include <haproxy/api-t.h>
-#include <haproxy/list-t.h>
 #include <import/eb32sctree.h>
 #include <import/eb32tree.h>
 
+#include <haproxy/list-t.h>
+#include <haproxy/thread-t.h>
+#include <haproxy/api-t.h>
+
 /* values for task->state */
 #define TASK_SLEEPING     0x0000  /* task sleeping */
 #define TASK_RUNNING      0x0001  /* the task is currently running */
@@ -110,8 +112,6 @@
 	int tid;                        /* TID of the tasklet owner, <0 if local */
 };
 
-#define TASK_IS_TASKLET(t) ((t)->nice == -32768)
-
 /*
  * The task callback (->process) is responsible for updating ->expire. It must
  * return a pointer to the task itself, except if the task has been deleted, in
@@ -136,7 +136,7 @@
 	void *arg;
 };
 
-#endif /* _TYPES_TASK_H */
+#endif /* _HAPROXY_TASK_T_H */
 
 /*
  * Local variables:
diff --git a/include/proto/task.h b/include/haproxy/task.h
similarity index 98%
rename from include/proto/task.h
rename to include/haproxy/task.h
index 85ec75a..3ba7fb9 100644
--- a/include/proto/task.h
+++ b/include/haproxy/task.h
@@ -1,8 +1,8 @@
 /*
- * include/proto/task.h
+ * include/haproxy/task.h
  * Functions for task management.
  *
- * Copyright (C) 2000-2010 Willy Tarreau - w@1wt.eu
+ * Copyright (C) 2000-2020 Willy Tarreau - w@1wt.eu
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -19,26 +19,25 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef _PROTO_TASK_H
-#define _PROTO_TASK_H
+#ifndef _HAPROXY_TASK_H
+#define _HAPROXY_TASK_H
 
 
 #include <sys/time.h>
 
+#include <import/eb32sctree.h>
+#include <import/eb32tree.h>
+
 #include <haproxy/api.h>
-#include <haproxy/pool.h>
+#include <haproxy/fd.h>
 #include <haproxy/global.h>
 #include <haproxy/intops.h>
 #include <haproxy/list.h>
-#include <haproxy/ticks.h>
+#include <haproxy/pool.h>
+#include <haproxy/task-t.h>
 #include <haproxy/thread.h>
-
-#include <import/eb32sctree.h>
-#include <import/eb32tree.h>
-
-#include <types/task.h>
+#include <haproxy/ticks.h>
 
-#include <haproxy/fd.h>
 
 /* Principle of the wait queue.
  *
@@ -83,6 +82,10 @@
 /* The farthest we can look back in a timer tree */
 #define TIMER_LOOK_BACK       (1U << 31)
 
+/* tasklets are recognized with nice==-32768 */
+#define TASK_IS_TASKLET(t) ((t)->nice == -32768)
+
+
 /* a few exported variables */
 extern unsigned int nb_tasks;     /* total number of tasks */
 extern volatile unsigned long global_tasks_mask; /* Mask of threads with tasks in the global runqueue */
@@ -94,6 +97,7 @@
 extern struct pool_head *pool_head_tasklet;
 extern struct pool_head *pool_head_notification;
 extern THREAD_LOCAL struct task_per_thread *sched; /* current's thread scheduler context */
+
 #ifdef USE_THREAD
 extern struct eb_root timers;      /* sorted timers tree, global */
 extern struct eb_root rqueue;      /* tree constituting the run queue */
@@ -105,8 +109,42 @@
 __decl_thread(extern HA_SPINLOCK_T rq_lock);  /* spin lock related to run queue */
 __decl_thread(extern HA_RWLOCK_T wq_lock);    /* RW lock related to the wait queue */
 
+void __task_wakeup(struct task *t, struct eb_root *);
+void __task_queue(struct task *task, struct eb_root *wq);
+
+struct work_list *work_list_create(int nbthread,
+                                   struct task *(*fct)(struct task *, void *, unsigned short),
+                                   void *arg);
+void work_list_destroy(struct work_list *work, int nbthread);
+int run_tasks_from_list(struct list *list, int max);
+
+/*
+ * This does 3 things :
+ *   - wake up all expired tasks
+ *   - call all runnable tasks
+ *   - return the date of next event in <next> or eternity.
+ */
+
+void process_runnable_tasks();
+
-static inline struct task *task_unlink_wq(struct task *t);
-static inline void task_queue(struct task *task);
+/*
+ * Extract all expired timers from the timer queue, and wakes up all
+ * associated tasks.
+ */
+void wake_expired_tasks();
+
+/* Checks the next timer for the current thread by looking into its own timer
+ * list and the global one. It may return TICK_ETERNITY if no timer is present.
+ * Note that the next timer might very well be slightly in the past.
+ */
+int next_timer_expiry();
+
+/*
+ * Delete every tasks before running the master polling loop
+ */
+void mworker_cleantasks();
+
+
 
 /* return 0 if task is in run queue, otherwise non-zero */
 static inline int task_in_rq(struct task *t)
@@ -123,11 +161,21 @@
 	return t->wq.node.leaf_p != NULL;
 }
 
+/* returns true if the current thread has some work to do */
+static inline int thread_has_tasks(void)
+{
+	return (!!(global_tasks_mask & tid_bit) |
+	        (sched->rqueue_size > 0) |
+	        !LIST_ISEMPTY(&sched->tasklets[TL_URGENT]) |
+	        !LIST_ISEMPTY(&sched->tasklets[TL_NORMAL]) |
+	        !LIST_ISEMPTY(&sched->tasklets[TL_BULK])   |
+		!MT_LIST_ISEMPTY(&sched->shared_tasklet_list));
+}
+
 /* puts the task <t> in run queue with reason flags <f>, and returns <t> */
 /* This will put the task in the local runqueue if the task is only runnable
  * by the current thread, in the global runqueue otherwies.
  */
-void __task_wakeup(struct task *t, struct eb_root *);
 static inline void task_wakeup(struct task *t, unsigned int f)
 {
 	unsigned short state;
@@ -152,24 +200,6 @@
 	}
 }
 
-/* change the thread affinity of a task to <thread_mask>.
- * This may only be done from within the running task itself or during its
- * initialization. It will unqueue and requeue the task from the wait queue
- * if it was in it. This is safe against a concurrent task_queue() call because
- * task_queue() itself will unlink again if needed after taking into account
- * the new thread_mask.
- */
-static inline void task_set_affinity(struct task *t, unsigned long thread_mask)
-{
-	if (unlikely(task_in_wq(t))) {
-		task_unlink_wq(t);
-		t->thread_mask = thread_mask;
-		task_queue(t);
-	}
-	else
-		t->thread_mask = thread_mask;
-}
-
 /*
  * Unlink the task from the wait queue, and possibly update the last_timer
  * pointer. A pointer to the task itself is returned. The task *must* already
@@ -201,6 +231,59 @@
 	return t;
 }
 
+/* Place <task> into the wait queue, where it may already be. If the expiration
+ * timer is infinite, do nothing and rely on wake_expired_task to clean up.
+ * If the task uses a shared wait queue, it's queued into the global wait queue,
+ * protected by the global wq_lock, otherwise by it necessarily belongs to the
+ * current thread'sand is queued without locking.
+ */
+static inline void task_queue(struct task *task)
+{
+	/* If we already have a place in the wait queue no later than the
+	 * timeout we're trying to set, we'll stay there, because it is very
+	 * unlikely that we will reach the timeout anyway. If the timeout
+	 * has been disabled, it's useless to leave the queue as well. We'll
+	 * rely on wake_expired_tasks() to catch the node and move it to the
+	 * proper place should it ever happen. Finally we only add the task
+	 * to the queue if it was not there or if it was further than what
+	 * we want.
+	 */
+	if (!tick_isset(task->expire))
+		return;
+
+#ifdef USE_THREAD
+	if (task->state & TASK_SHARED_WQ) {
+		HA_RWLOCK_WRLOCK(TASK_WQ_LOCK, &wq_lock);
+		if (!task_in_wq(task) || tick_is_lt(task->expire, task->wq.key))
+			__task_queue(task, &timers);
+		HA_RWLOCK_WRUNLOCK(TASK_WQ_LOCK, &wq_lock);
+	} else
+#endif
+	{
+		BUG_ON((task->thread_mask & tid_bit) == 0); // should have TASK_SHARED_WQ
+		if (!task_in_wq(task) || tick_is_lt(task->expire, task->wq.key))
+			__task_queue(task, &sched->timers);
+	}
+}
+
+/* change the thread affinity of a task to <thread_mask>.
+ * This may only be done from within the running task itself or during its
+ * initialization. It will unqueue and requeue the task from the wait queue
+ * if it was in it. This is safe against a concurrent task_queue() call because
+ * task_queue() itself will unlink again if needed after taking into account
+ * the new thread_mask.
+ */
+static inline void task_set_affinity(struct task *t, unsigned long thread_mask)
+{
+	if (unlikely(task_in_wq(t))) {
+		task_unlink_wq(t);
+		t->thread_mask = thread_mask;
+		task_queue(t);
+	}
+	else
+		t->thread_mask = thread_mask;
+}
+
 /*
  * Unlink the task from the run queue. The tasks_run_queue size and number of
  * niced tasks are updated too. A pointer to the task itself is returned. The
@@ -419,43 +502,6 @@
 	tl->tid = tid;
 }
 
-void __task_queue(struct task *task, struct eb_root *wq);
-
-/* Place <task> into the wait queue, where it may already be. If the expiration
- * timer is infinite, do nothing and rely on wake_expired_task to clean up.
- * If the task uses a shared wait queue, it's queued into the global wait queue,
- * protected by the global wq_lock, otherwise by it necessarily belongs to the
- * current thread'sand is queued without locking.
- */
-static inline void task_queue(struct task *task)
-{
-	/* If we already have a place in the wait queue no later than the
-	 * timeout we're trying to set, we'll stay there, because it is very
-	 * unlikely that we will reach the timeout anyway. If the timeout
-	 * has been disabled, it's useless to leave the queue as well. We'll
-	 * rely on wake_expired_tasks() to catch the node and move it to the
-	 * proper place should it ever happen. Finally we only add the task
-	 * to the queue if it was not there or if it was further than what
-	 * we want.
-	 */
-	if (!tick_isset(task->expire))
-		return;
-
-#ifdef USE_THREAD
-	if (task->state & TASK_SHARED_WQ) {
-		HA_RWLOCK_WRLOCK(TASK_WQ_LOCK, &wq_lock);
-		if (!task_in_wq(task) || tick_is_lt(task->expire, task->wq.key))
-			__task_queue(task, &timers);
-		HA_RWLOCK_WRUNLOCK(TASK_WQ_LOCK, &wq_lock);
-	} else
-#endif
-	{
-		BUG_ON((task->thread_mask & tid_bit) == 0); // should have TASK_SHARED_WQ
-		if (!task_in_wq(task) || tick_is_lt(task->expire, task->wq.key))
-			__task_queue(task, &sched->timers);
-	}
-}
-
 /* Ensure <task> will be woken up at most at <when>. If the task is already in
  * the run queue (but not running), nothing is done. It may be used that way
  * with a delay :  task_schedule(task, tick_add(now_ms, delay));
@@ -586,16 +632,6 @@
 	return !LIST_ISEMPTY(wake);
 }
 
-static inline int thread_has_tasks(void)
-{
-	return (!!(global_tasks_mask & tid_bit) |
-	        (sched->rqueue_size > 0) |
-	        !LIST_ISEMPTY(&sched->tasklets[TL_URGENT]) |
-	        !LIST_ISEMPTY(&sched->tasklets[TL_NORMAL]) |
-	        !LIST_ISEMPTY(&sched->tasklets[TL_BULK])   |
-		!MT_LIST_ISEMPTY(&sched->shared_tasklet_list));
-}
-
 /* adds list item <item> to work list <work> and wake up the associated task */
 static inline void work_list_add(struct work_list *work, struct mt_list *item)
 {
@@ -603,40 +639,7 @@
 	task_wakeup(work->task, TASK_WOKEN_OTHER);
 }
 
-struct work_list *work_list_create(int nbthread,
-                                   struct task *(*fct)(struct task *, void *, unsigned short),
-                                   void *arg);
-
-void work_list_destroy(struct work_list *work, int nbthread);
-int run_tasks_from_list(struct list *list, int max);
-
-/*
- * This does 3 things :
- *   - wake up all expired tasks
- *   - call all runnable tasks
- *   - return the date of next event in <next> or eternity.
- */
-
-void process_runnable_tasks();
-
-/*
- * Extract all expired timers from the timer queue, and wakes up all
- * associated tasks.
- */
-void wake_expired_tasks();
-
-/* Checks the next timer for the current thread by looking into its own timer
- * list and the global one. It may return TICK_ETERNITY if no timer is present.
- * Note that the next timer might very well be slightly in the past.
- */
-int next_timer_expiry();
-
-/*
- * Delete every tasks before running the master polling loop
- */
-void mworker_cleantasks();
-
-#endif /* _PROTO_TASK_H */
+#endif /* _HAPROXY_TASK_H */
 
 /*
  * Local variables:
diff --git a/include/proto/applet.h b/include/proto/applet.h
index 80744ba..48437f5 100644
--- a/include/proto/applet.h
+++ b/include/proto/applet.h
@@ -28,7 +28,7 @@
 #include <haproxy/pool.h>
 #include <haproxy/list.h>
 #include <types/applet.h>
-#include <proto/task.h>
+#include <haproxy/task.h>
 
 extern unsigned int nb_applets;
 extern struct pool_head *pool_head_appctx;
diff --git a/include/proto/channel.h b/include/proto/channel.h
index 3547581..96bf212 100644
--- a/include/proto/channel.h
+++ b/include/proto/channel.h
@@ -40,7 +40,7 @@
 #include <types/stream_interface.h>
 
 #include <proto/stream.h>
-#include <proto/task.h>
+#include <haproxy/task.h>
 
 /* perform minimal intializations, report 0 in case of error, 1 if OK. */
 int init_channel();
diff --git a/include/proto/connection.h b/include/proto/connection.h
index 753aea4..baa801f 100644
--- a/include/proto/connection.h
+++ b/include/proto/connection.h
@@ -30,7 +30,7 @@
 #include <types/connection.h>
 #include <haproxy/fd.h>
 #include <proto/session.h>
-#include <proto/task.h>
+#include <haproxy/task.h>
 
 extern struct pool_head *pool_head_connection;
 extern struct pool_head *pool_head_connstream;
diff --git a/include/proto/proto_tcp.h b/include/proto/proto_tcp.h
index 29e6c1c..ad428ee 100644
--- a/include/proto/proto_tcp.h
+++ b/include/proto/proto_tcp.h
@@ -23,7 +23,6 @@
 #define _PROTO_PROTO_TCP_H
 
 #include <haproxy/api.h>
-#include <types/task.h>
 #include <proto/stick_table.h>
 
 int tcp_bind_socket(int fd, int flags, struct sockaddr_storage *local, struct sockaddr_storage *remote);
diff --git a/include/proto/queue.h b/include/proto/queue.h
index d4da40c..4397d60 100644
--- a/include/proto/queue.h
+++ b/include/proto/queue.h
@@ -29,7 +29,6 @@
 #include <types/queue.h>
 #include <types/stream.h>
 #include <types/server.h>
-#include <types/task.h>
 
 #include <proto/backend.h>
 
diff --git a/include/proto/signal.h b/include/proto/signal.h
index aaa23f6..04dc449 100644
--- a/include/proto/signal.h
+++ b/include/proto/signal.h
@@ -15,7 +15,7 @@
 #include <haproxy/thread.h>
 
 #include <types/signal.h>
-#include <types/task.h>
+#include <haproxy/task-t.h>
 
 extern int signal_queue_len;
 extern struct signal_descriptor signal_state[];
diff --git a/include/proto/stream.h b/include/proto/stream.h
index 1c0fd45..9be8d46 100644
--- a/include/proto/stream.h
+++ b/include/proto/stream.h
@@ -31,7 +31,7 @@
 #include <haproxy/obj_type.h>
 #include <proto/queue.h>
 #include <proto/stick_table.h>
-#include <proto/task.h>
+#include <haproxy/task.h>
 #include <proto/trace.h>
 
 extern struct trace_source trace_strm;
diff --git a/include/proto/tcp_rules.h b/include/proto/tcp_rules.h
index 2059c09..5f12c26 100644
--- a/include/proto/tcp_rules.h
+++ b/include/proto/tcp_rules.h
@@ -24,7 +24,6 @@
 
 #include <haproxy/action-t.h>
 #include <haproxy/api.h>
-#include <types/task.h>
 #include <proto/stick_table.h>
 
 int tcp_inspect_request(struct stream *s, struct channel *req, int an_bit);
diff --git a/include/types/checks.h b/include/types/checks.h
index 371ed43..c7f08b2 100644
--- a/include/types/checks.h
+++ b/include/types/checks.h
@@ -25,7 +25,7 @@
 #include <types/connection.h>
 #include <haproxy/sample-t.h>
 #include <types/session.h>
-#include <types/task.h>
+#include <haproxy/task-t.h>
 
 /* enum used by check->result. Must remain in this order, as some code uses
  * result >= CHK_RES_PASSED to declare success.
diff --git a/include/types/server.h b/include/types/server.h
index a9d333e..a2f1fe3 100644
--- a/include/types/server.h
+++ b/include/types/server.h
@@ -40,7 +40,7 @@
 #include <haproxy/freq_ctr-t.h>
 #include <types/queue.h>
 #include <types/ssl_sock.h>
-#include <types/task.h>
+#include <haproxy/task-t.h>
 #include <types/checks.h>
 
 
diff --git a/include/types/session.h b/include/types/session.h
index 3e49b46..559e786 100644
--- a/include/types/session.h
+++ b/include/types/session.h
@@ -34,7 +34,7 @@
 #include <haproxy/vars-t.h>
 
 #include <types/stick_table.h>
-#include <types/task.h>
+#include <haproxy/task-t.h>
 
 struct sess_srv_list {
 	void *target;
diff --git a/include/types/spoe.h b/include/types/spoe.h
index fdaba93..c7ed45d 100644
--- a/include/types/spoe.h
+++ b/include/types/spoe.h
@@ -34,7 +34,7 @@
 #include <types/proxy.h>
 #include <haproxy/sample-t.h>
 #include <types/stream.h>
-#include <types/task.h>
+#include <haproxy/task-t.h>
 
 /* Type of list of messages */
 #define SPOE_MSGS_BY_EVENT 0x01
diff --git a/include/types/stream.h b/include/types/stream.h
index 8870842..e2e01db 100644
--- a/include/types/stream.h
+++ b/include/types/stream.h
@@ -43,7 +43,7 @@
 #include <types/server.h>
 #include <types/session.h>
 #include <types/stream_interface.h>
-#include <types/task.h>
+#include <haproxy/task-t.h>
 #include <types/stick_table.h>
 
 /* Various Stream Flags, bits values 0x01 to 0x100 (shift 0) */