--- libaitsched/inc/aitsched.h 2013/05/26 20:14:02 1.17.2.1 +++ libaitsched/inc/aitsched.h 2014/01/27 15:01:52 1.24.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsched.h,v 1.17.2.1 2013/05/26 20:14:02 misho Exp $ +* $Id: aitsched.h,v 1.24.2.1 2014/01/27 15:01:52 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -49,7 +49,9 @@ SUCH DAMAGE. #include #include +#ifndef KQ_DISABLE #include +#endif #include #include #include @@ -67,7 +69,8 @@ SUCH DAMAGE. #define CRITERIA_VAL 4 #define CRITERIA_TS 5 #define CRITERIA_DATA 6 -#define CRITERIA_ID 7 +#define CRITERIA_DATLEN 7 +#define CRITERIA_ID 8 /* early declaration for root & task */ @@ -91,6 +94,7 @@ typedef enum { taskREADY, taskUNUSE, taskTHREAD, + taskRTC, taskMAX } sched_task_type_t; @@ -126,6 +130,8 @@ struct sched_HooksTask { sched_hook_func_t suspend; /* thread(sched_task_t *task, NULL) -> int */ sched_hook_func_t thread; + /* rtc(sched_task_t *task, NULL) -> int */ + sched_hook_func_t rtc; } hook_add; struct { /* exit(sched_task_t *task, void *exitValue) -> int */ @@ -176,7 +182,7 @@ struct sched_Task { #define TASK_FUNC(x) (x)->task_func intptr_t task_ret; #define TASK_RET(x) (x)->task_ret - unsigned int task_flag; + unsigned long task_flag; #define TASK_FLAG(x) (x)->task_flag void *task_arg; @@ -207,6 +213,7 @@ typedef TAILQ_HEAD(, sched_Task) sched_queue_t; /* root task */ struct sched_RootTask { int root_kq; + fd_set root_fds; unsigned long root_miss; struct timespec root_wait; struct timespec root_poll; @@ -231,6 +238,7 @@ struct sched_RootTask { sched_queue_t root_ready; sched_queue_t root_unuse; sched_queue_t root_thread; + sched_queue_t root_rtc; hooks_task_t root_hooks; struct iovec root_data; @@ -335,13 +343,34 @@ int schedCancel(sched_task_t * __restrict task); * @root = root task * @type = cancel from queue type, if =taskMAX cancel same task from all queues * @criteria = find task by criteria - * [CRITERIA_ANY|CRITERIA_CALL|CRITERIA_ARG|CRITERIA_FD|CRITERIA_VAL|CRITERIA_ID|CRITERIA_TS|CRITERIA_DATA] + * [ CRITERIA_ANY|CRITERIA_CALL|CRITERIA_ARG|CRITERIA_FD|CRITERIA_VAL| + * CRITERIA_ID|CRITERIA_TS|CRITERIA_DATA|CRITERIA_DATLEN ] * @param = search parameter * @hook = custom cleanup hook function, may be NULL * return: -1 error, -2 error in sub-stage cancel execution, -3 error from custom hook or 0 ok */ int schedCancelby(sched_root_task_t * __restrict root, sched_task_type_t type, - u_char criteria, void *param, sched_hook_func_t hook); + unsigned char criteria, void *param, sched_hook_func_t hook); +/* + * schedQuery() - Query task in scheduler + * + * @task = task + * return: -1 error, 0 found and 1 not found + */ +int schedQuery(sched_task_t * __restrict task); +/* + * schedQueryby() - Query task in scheduler by criteria + * + * @root = root task + * @type = query from queue type, if =taskMAX query same task from all queues + * @criteria = find task by criteria + * [ CRITERIA_ANY|CRITERIA_CALL|CRITERIA_ARG|CRITERIA_FD|CRITERIA_VAL| + * CRITERIA_ID|CRITERIA_TS|CRITERIA_DATA|CRITERIA_DATLEN ] + * @param = search parameter + * return: -1 error, 0 found or 1 not found + */ +int schedQueryby(sched_root_task_t * __restrict root, sched_task_type_t type, + unsigned char criteria, void *param); /* @@ -381,7 +410,7 @@ sched_task_t *schedWrite(sched_root_task_t * __restric * @func = task execution function * @arg = 1st func argument * @ts = timeout argument structure, minimum alarm timer resolution is 1msec! - * @opt_data = Optional data + * @opt_data = Alarm timer ID * @opt_dlen = Optional data length * return: NULL error or !=NULL new queued task */ @@ -390,6 +419,21 @@ sched_task_t *schedAlarm(sched_root_task_t * __restric #define schedAlarmSelf(x) schedAlarm(TASK_ROOT((x)), TASK_FUNC((x)), TASK_ARG((x)), \ TASK_TS((x)), TASK_DATA((x)), TASK_DATLEN((x))) /* + * schedRTC() - Add RTC task to scheduler queue + * + * @root = root task + * @func = task execution function + * @arg = 1st func argument + * @ts = timeout argument structure, minimum alarm timer resolution is 1msec! + * @opt_data = Optional RTC ID + * @opt_dlen = Optional data length + * return: NULL error or !=NULL new queued task + */ +sched_task_t *schedRTC(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, + struct timespec ts, void *opt_data, size_t opt_dlen); +#define schedRTCSelf(x) schedRTC(TASK_ROOT((x)), TASK_FUNC((x)), TASK_ARG((x)), \ + TASK_TS((x)), TASK_DATA((x)), TASK_DATLEN((x))) +/* * schedNode() - Add NODE task to scheduler queue * * @root = root task @@ -557,8 +601,6 @@ int schedTrigger(sched_task_t * __restrict task); */ sched_task_t *schedTimer(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, struct timespec ts, void *opt_data, size_t opt_dlen); -#define schedTimerSelf(x) schedTimer(TASK_ROOT((x)), TASK_FUNC((x)), TASK_ARG((x)), \ - TASK_TS((x)), TASK_DATA((x)), TASK_DATLEN((x))) /* * schedEvent() - Add EVENT task to scheduler queue * @@ -609,8 +651,8 @@ sched_task_t *schedSuspend(sched_root_task_t * __restr * * @root = root task * @criteria = find task by criteria - * [CRITERIA_ANY|CRITERIA_ID|CRITERIA_DATA] - * @param = search parameter (sched_task_t *task| u_long id) + * [ CRITERIA_ANY|CRITERIA_ID|CRITERIA_VAL|CRITERIA_DATA ] + * @param = search parameter (sched_task_t *task| unsigned long id) * return: -1 error or 0 resumed ok */ int schedResumeby(sched_root_task_t * __restrict root, unsigned char criteria, void *param); @@ -637,16 +679,15 @@ sched_task_t *schedCallOnce(sched_root_task_t * __rest * @root = root task * @func = task execution function * @arg = 1st func argument - * @detach = Detach thread from scheduler, if !=0 * @ss = stack size * @opt_data = Optional data * @opt_dlen = Optional data length * return: NULL error or !=NULL new queued task */ sched_task_t *schedThread(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, - int detach, size_t ss, void *opt_data, size_t opt_dlen); + size_t ss, void *opt_data, size_t opt_dlen); #define schedThreadSelf(x) schedThread(TASK_ROOT((x)), TASK_FUNC((x)), TASK_ARG((x)), \ - (TASK_FLAG((x)) & 0x1), (size_t) (TASK_FLAG((x)) >> 1), TASK_DATA((x)), TASK_DATLEN((x))) + (size_t) TASK_FLAG((x)), TASK_DATA((x)), TASK_DATLEN((x))) /* * sched_taskExit() - Exit routine for scheduler task, explicit required for thread tasks *