2006-06-26 02:48:02 +02:00
/*
include / proto / task . h
Functions for task management .
Copyright ( C ) 2000 - 2006 Willy Tarreau - w @ 1 wt . eu
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation , version 2.1
exclusively .
This library is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public
License along with this library ; if not , write to the Free Software
Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
# ifndef _PROTO_TASK_H
# define _PROTO_TASK_H
# include <sys/time.h>
2006-06-29 18:54:54 +02:00
# include <common/config.h>
2006-06-29 17:53:05 +02:00
# include <common/memory.h>
2006-06-29 18:54:54 +02:00
# include <types/task.h>
2006-06-26 02:48:02 +02:00
/* puts the task <t> in run queue <q>, and returns <t> */
static inline struct task * task_wakeup ( struct task * * q , struct task * t )
{
if ( t - > state = = TASK_RUNNING )
return t ;
else {
t - > rqnext = * q ;
t - > state = TASK_RUNNING ;
return * q = t ;
}
}
/* removes the task <t> from the queue <q>
* < s > MUST be < q > ' s first task .
* set the run queue to point to the next one , and return it
*/
static inline struct task * task_sleep ( struct task * * q , struct task * t )
{
if ( t - > state = = TASK_RUNNING ) {
* q = t - > rqnext ;
t - > state = TASK_IDLE ; /* tell that s has left the run queue */
}
return * q ; /* return next running task */
}
/*
* removes the task < t > from its wait queue . It must have already been removed
* from the run queue . A pointer to the task itself is returned .
*/
static inline struct task * task_delete ( struct task * t )
{
t - > prev - > next = t - > next ;
t - > next - > prev = t - > prev ;
return t ;
}
/*
* frees a task . Its context must have been freed since it will be lost .
*/
static inline void task_free ( struct task * t )
{
pool_free ( task , t ) ;
}
/* inserts <task> into its assigned wait queue, where it may already be. In this case, it
* may be only moved or left where it was , depending on its timing requirements .
* < task > is returned .
*/
struct task * task_queue ( struct task * task ) ;
/*
* This does 4 things :
* - wake up all expired tasks
* - call all runnable tasks
* - call maintain_proxies ( ) to enable / disable the listeners
* - return the delay till next event in ms , - 1 = wait indefinitely
* Note : this part should be rewritten with the O ( ln ( n ) ) scheduler .
*
*/
int process_runnable_tasks ( ) ;
# endif /* _PROTO_TASK_H */
/*
* Local variables :
* c - indent - level : 8
* c - basic - offset : 8
* End :
*/