blob: c923a9866ed7c678b79a1f0bd67a295d70e075bb [file] [log] [blame]
Willy Tarreaubaaee002006-06-26 02:48:02 +02001/*
2 include/proto/task.h
3 Functions for task management.
4
Willy Tarreau9789f7b2008-06-24 08:17:16 +02005 Copyright (C) 2000-2008 Willy Tarreau - w@1wt.eu
Willy Tarreaubaaee002006-06-26 02:48:02 +02006
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation, version 2.1
10 exclusively.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public
18 License along with this library; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20*/
21
22#ifndef _PROTO_TASK_H
23#define _PROTO_TASK_H
24
25
26#include <sys/time.h>
Willy Tarreaue3ba5f02006-06-29 18:54:54 +020027
28#include <common/config.h>
Willy Tarreau2dd0d472006-06-29 17:53:05 +020029#include <common/memory.h>
Willy Tarreau96bcfd72007-04-29 10:41:56 +020030#include <common/mini-clist.h>
31#include <common/standard.h>
32
Willy Tarreaue3ba5f02006-06-29 18:54:54 +020033#include <types/task.h>
Willy Tarreaubaaee002006-06-26 02:48:02 +020034
Willy Tarreau91e99932008-06-30 07:51:00 +020035extern unsigned int run_queue; /* run queue size */
36extern unsigned int niced_tasks; /* number of niced tasks in the run queue */
Willy Tarreauc6ca1a02007-05-13 19:43:47 +020037extern struct pool_head *pool2_task;
Willy Tarreauce44f122008-07-05 18:16:19 +020038extern struct task *last_timer; /* optimization: last queued timer */
Willy Tarreauc6ca1a02007-05-13 19:43:47 +020039
Willy Tarreau9789f7b2008-06-24 08:17:16 +020040/* perform minimal initializations, report 0 in case of error, 1 if OK. */
Willy Tarreauc6ca1a02007-05-13 19:43:47 +020041int init_task();
Willy Tarreau96bcfd72007-04-29 10:41:56 +020042
Willy Tarreaufdccded2008-08-29 18:19:04 +020043/* puts the task <t> in run queue with reason flags <f>, and returns <t> */
Willy Tarreau4df82062008-08-29 15:26:14 +020044struct task *__task_wakeup(struct task *t);
Willy Tarreaufdccded2008-08-29 18:19:04 +020045static inline struct task *task_wakeup(struct task *t, unsigned int f)
Willy Tarreau4df82062008-08-29 15:26:14 +020046{
Willy Tarreaufdccded2008-08-29 18:19:04 +020047 if (likely(!(t->state & TASK_IN_RUNQUEUE)))
48 __task_wakeup(t);
49 t->state |= f;
50 return t;
Willy Tarreau4df82062008-08-29 15:26:14 +020051}
Willy Tarreaubaaee002006-06-26 02:48:02 +020052
Willy Tarreau96bcfd72007-04-29 10:41:56 +020053/* removes the task <t> from the run queue if it was in it.
54 * returns <t>.
Willy Tarreaubaaee002006-06-26 02:48:02 +020055 */
Willy Tarreau96bcfd72007-04-29 10:41:56 +020056static inline struct task *task_sleep(struct task *t)
Willy Tarreaubaaee002006-06-26 02:48:02 +020057{
Willy Tarreaufdccded2008-08-29 18:19:04 +020058 if (t->state & TASK_IN_RUNQUEUE) {
59 t->state = TASK_SLEEPING;
Willy Tarreau58b458d2008-06-29 22:40:23 +020060 eb32_delete(&t->eb);
61 run_queue--;
Willy Tarreau91e99932008-06-30 07:51:00 +020062 if (likely(t->nice))
63 niced_tasks--;
Willy Tarreaubaaee002006-06-26 02:48:02 +020064 }
Willy Tarreau96bcfd72007-04-29 10:41:56 +020065 return t;
Willy Tarreaubaaee002006-06-26 02:48:02 +020066}
67
68/*
Willy Tarreau96bcfd72007-04-29 10:41:56 +020069 * unlinks the task from wherever it is queued :
Willy Tarreau58b458d2008-06-29 22:40:23 +020070 * - run_queue
Willy Tarreau9789f7b2008-06-24 08:17:16 +020071 * - wait queue
Willy Tarreau96bcfd72007-04-29 10:41:56 +020072 * A pointer to the task itself is returned.
Willy Tarreaubaaee002006-06-26 02:48:02 +020073 */
Willy Tarreauce44f122008-07-05 18:16:19 +020074static inline struct task *task_dequeue(struct task *t)
Willy Tarreaubaaee002006-06-26 02:48:02 +020075{
Willy Tarreauce44f122008-07-05 18:16:19 +020076 if (likely(t->eb.node.leaf_p)) {
77 if (last_timer == t)
78 last_timer = NULL;
Willy Tarreau9789f7b2008-06-24 08:17:16 +020079 eb32_delete(&t->eb);
Willy Tarreauce44f122008-07-05 18:16:19 +020080 }
81 return t;
82}
Willy Tarreau9789f7b2008-06-24 08:17:16 +020083
Willy Tarreauce44f122008-07-05 18:16:19 +020084/*
85 * Unlinks the task and adjusts run queue stats.
86 * A pointer to the task itself is returned.
87 */
88static inline struct task *task_delete(struct task *t)
89{
90 task_dequeue(t);
Willy Tarreaufdccded2008-08-29 18:19:04 +020091 if (t->state & TASK_IN_RUNQUEUE) {
Willy Tarreau58b458d2008-06-29 22:40:23 +020092 run_queue--;
Willy Tarreau91e99932008-06-30 07:51:00 +020093 if (likely(t->nice))
94 niced_tasks--;
95 }
Willy Tarreau9789f7b2008-06-24 08:17:16 +020096 return t;
97}
98
99/*
100 * Initialize a new task. The bare minimum is performed (queue pointers and state).
101 * The task is returned.
102 */
103static inline struct task *task_init(struct task *t)
104{
Willy Tarreau9789f7b2008-06-24 08:17:16 +0200105 t->eb.node.leaf_p = NULL;
Willy Tarreaufdccded2008-08-29 18:19:04 +0200106 t->state = TASK_SLEEPING;
Willy Tarreau91e99932008-06-30 07:51:00 +0200107 t->nice = 0;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200108 return t;
109}
110
111/*
112 * frees a task. Its context must have been freed since it will be lost.
113 */
114static inline void task_free(struct task *t)
115{
Willy Tarreauc6ca1a02007-05-13 19:43:47 +0200116 pool_free2(pool2_task, t);
Willy Tarreaubaaee002006-06-26 02:48:02 +0200117}
118
119/* inserts <task> into its assigned wait queue, where it may already be. In this case, it
120 * may be only moved or left where it was, depending on its timing requirements.
121 * <task> is returned.
122 */
123struct task *task_queue(struct task *task);
124
125/*
126 * This does 4 things :
127 * - wake up all expired tasks
128 * - call all runnable tasks
129 * - call maintain_proxies() to enable/disable the listeners
Willy Tarreaud825eef2007-05-12 22:35:00 +0200130 * - return the date of next event in <next> or eternity.
Willy Tarreaubaaee002006-06-26 02:48:02 +0200131 */
132
Willy Tarreau0c303ee2008-07-07 00:09:58 +0200133void process_runnable_tasks(int *next);
Willy Tarreaubaaee002006-06-26 02:48:02 +0200134
Willy Tarreau58b458d2008-06-29 22:40:23 +0200135/*
136 * Extract all expired timers from the timer queue, and wakes up all
137 * associated tasks. Returns the date of next event (or eternity).
138 */
Willy Tarreau0c303ee2008-07-07 00:09:58 +0200139void wake_expired_tasks(int *next);
Willy Tarreau58b458d2008-06-29 22:40:23 +0200140
Willy Tarreaubaaee002006-06-26 02:48:02 +0200141
142#endif /* _PROTO_TASK_H */
143
144/*
145 * Local variables:
146 * c-indent-level: 8
147 * c-basic-offset: 8
148 * End:
149 */