--- libaitsched/inc/aitsched.h 2011/08/11 22:55:28 1.1.1.1.2.1 +++ libaitsched/inc/aitsched.h 2011/11/30 23:41:50 1.2.2.5 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsched.h,v 1.1.1.1.2.1 2011/08/11 22:55:28 misho Exp $ +* $Id: aitsched.h,v 1.2.2.5 2011/11/30 23:41:50 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -47,6 +47,12 @@ SUCH DAMAGE. #define __AITSCHED_H +#include +#include +#include +#include + + /* criteria type */ #define CRITERIA_CALL 0 #define CRITERIA_ARG 1 @@ -91,18 +97,22 @@ struct sched_HooksTask { sched_hook_func_t run; /* fetch(sched_root_task_t *root, NULL) -> sched_task_t* */ sched_hook_func_t fetch; + /* exception(sched_root_task_t *root, NULL) -> int */ + sched_hook_func_t exception; } hook_exec; struct { /* init(sched_root_task_t *root, void *data) -> int */ sched_hook_func_t init; /* fini(sched_root_task_t *root, NULL) -> int */ sched_hook_func_t fini; + /* error(sched_root_task_t *root, int errno) -> int */ + sched_hook_func_t error; } hook_root; }; typedef struct sched_HooksTask hooks_task_t; /* task callback, like pthread callback! */ -typedef void *(*sched_task_func_t)(void *); +typedef void *(*sched_task_func_t)(sched_task_t * /* current task data*/); /* task & queue */ struct sched_Task { @@ -110,12 +120,13 @@ struct sched_Task { sched_task_type_t task_type; sched_root_task_t *task_root; +#define TASK_ROOT(x) (x)->task_root sched_task_func_t task_func; void *task_arg; union { unsigned long v; - int fd; + intptr_t fd; struct timeval tv; } task_val; #define TASK_ARG(x) (x)->task_arg @@ -152,6 +163,11 @@ struct sched_RootTask { }; +inline int sched_GetErrno(); +inline const char *sched_GetError(); +inline void sched_SetErr(int, char *, ...); + + /* * schedInit() - Init scheduler * @data = optional data if !=NULL @@ -159,13 +175,13 @@ struct sched_RootTask { * return: allocated root task if ok or NULL error */ sched_root_task_t *schedInit(void ** __restrict data, size_t datlen); -#define schedBegin() schedInit(&schedRegisterHooks, 0) +#define schedBegin() schedInit((void**) &schedRegisterHooks, 0) /* * schedEnd() - End scheduler & free all resources * @root = root task * return: -1 error or 0 ok */ -int schedEnd(sched_root_task_t * __restrict root); +int schedEnd(sched_root_task_t ** __restrict root); /* * schedRegisterHooks() - Register IO handles and bind tasks to it * @root = root task @@ -187,9 +203,10 @@ inline void *schedFetch(sched_root_task_t * __restrict /* * schedRun() - Scheduler *run loop* * @root = root task + * @killState = kill condition variable, if !=0 stop scheduler loop * return: -1 error or 0 ok */ -int schedRun(sched_root_task_t * __restrict root); +int schedRun(sched_root_task_t * __restrict root, volatile intptr_t * __restrict killState); /* * schedCancel() - Cancel task from scheduler * @task = task @@ -232,10 +249,10 @@ sched_task_t *schedWrite(sched_root_task_t * __restric * @root = root task * @func = task execution function * @arg = 1st func argument - * @ms = arguments in microSecs, define period 1sec == 1000000 + * @tv = timeout argument structure * return: NULL error or !=NULL new queued task */ -sched_task_t *schedTimer(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, unsigned int ms); +sched_task_t *schedTimer(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, struct timeval tv); /* * schedEvent() - Add EVENT task to scheduler queue * @root = root task