blob: 6bee1b2f19cb37a7cb45a9e5629ae82206f7a5fc [file] [log] [blame]
Willy Tarreaubaaee002006-06-26 02:48:02 +02001/*
2 include/proto/task.h
3 Functions for task management.
4
Willy Tarreau96bcfd72007-04-29 10:41:56 +02005 Copyright (C) 2000-2007 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 Tarreau96bcfd72007-04-29 10:41:56 +020035extern void *run_queue;
Willy Tarreauc6ca1a02007-05-13 19:43:47 +020036extern struct pool_head *pool2_task;
37
38/* perform minimal intializations, report 0 in case of error, 1 if OK. */
39int init_task();
Willy Tarreau96bcfd72007-04-29 10:41:56 +020040
41/* needed later */
42void *tree_delete(void *node);
Willy Tarreaubaaee002006-06-26 02:48:02 +020043
44/* puts the task <t> in run queue <q>, and returns <t> */
Willy Tarreaue33aece2007-04-30 13:15:14 +020045#define task_wakeup _task_wakeup
46struct task *_task_wakeup(struct task *t);
47static inline struct task *__task_wakeup(struct task *t)
Willy Tarreaubaaee002006-06-26 02:48:02 +020048{
49 if (t->state == TASK_RUNNING)
50 return t;
Willy Tarreau96bcfd72007-04-29 10:41:56 +020051
52 if (t->qlist.p != NULL)
53 DLIST_DEL(&t->qlist);
54
55 DLIST_ADD(run_queue, &t->qlist);
56 t->state = TASK_RUNNING;
57
58 if (likely(t->wq)) {
59 tree_delete(t->wq);
60 t->wq = NULL;
Willy Tarreaubaaee002006-06-26 02:48:02 +020061 }
Willy Tarreau96bcfd72007-04-29 10:41:56 +020062
63 return t;
Willy Tarreaubaaee002006-06-26 02:48:02 +020064}
65
Willy Tarreau96bcfd72007-04-29 10:41:56 +020066/* removes the task <t> from the run queue if it was in it.
67 * returns <t>.
Willy Tarreaubaaee002006-06-26 02:48:02 +020068 */
Willy Tarreau96bcfd72007-04-29 10:41:56 +020069static inline struct task *task_sleep(struct task *t)
Willy Tarreaubaaee002006-06-26 02:48:02 +020070{
71 if (t->state == TASK_RUNNING) {
Willy Tarreau96bcfd72007-04-29 10:41:56 +020072 DLIST_DEL(&t->qlist);
73 t->qlist.p = NULL;
74 t->state = TASK_IDLE;
Willy Tarreaubaaee002006-06-26 02:48:02 +020075 }
Willy Tarreau96bcfd72007-04-29 10:41:56 +020076 return t;
Willy Tarreaubaaee002006-06-26 02:48:02 +020077}
78
79/*
Willy Tarreau96bcfd72007-04-29 10:41:56 +020080 * unlinks the task from wherever it is queued :
81 * - eternity_queue, run_queue
82 * - wait queue : wq not null => remove carrier node too
83 * A pointer to the task itself is returned.
Willy Tarreaubaaee002006-06-26 02:48:02 +020084 */
85static inline struct task *task_delete(struct task *t)
86{
Willy Tarreau96bcfd72007-04-29 10:41:56 +020087 if (t->qlist.p != NULL) {
88 DLIST_DEL(&t->qlist);
89 t->qlist.p = NULL;
90 }
91
92 if (t->wq) {
93 tree_delete(t->wq);
94 t->wq = NULL;
95 }
Willy Tarreaubaaee002006-06-26 02:48:02 +020096 return t;
97}
98
99/*
100 * frees a task. Its context must have been freed since it will be lost.
101 */
102static inline void task_free(struct task *t)
103{
Willy Tarreauc6ca1a02007-05-13 19:43:47 +0200104 pool_free2(pool2_task, t);
Willy Tarreaubaaee002006-06-26 02:48:02 +0200105}
106
107/* inserts <task> into its assigned wait queue, where it may already be. In this case, it
108 * may be only moved or left where it was, depending on its timing requirements.
109 * <task> is returned.
110 */
111struct task *task_queue(struct task *task);
112
113/*
114 * This does 4 things :
115 * - wake up all expired tasks
116 * - call all runnable tasks
117 * - call maintain_proxies() to enable/disable the listeners
Willy Tarreaud825eef2007-05-12 22:35:00 +0200118 * - return the date of next event in <next> or eternity.
Willy Tarreaubaaee002006-06-26 02:48:02 +0200119 */
120
Willy Tarreaud825eef2007-05-12 22:35:00 +0200121void process_runnable_tasks(struct timeval *next);
Willy Tarreaubaaee002006-06-26 02:48:02 +0200122
123
124#endif /* _PROTO_TASK_H */
125
126/*
127 * Local variables:
128 * c-indent-level: 8
129 * c-basic-offset: 8
130 * End:
131 */