--- libaitsched/src/aitsched.c 2011/09/09 14:14:33 1.1.1.1.2.5 +++ libaitsched/src/aitsched.c 2011/12/08 08:02:23 1.3 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsched.c,v 1.1.1.1.2.5 2011/09/09 14:14:33 misho Exp $ +* $Id: aitsched.c,v 1.3 2011/12/08 08:02:23 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -104,6 +104,7 @@ schedRegisterHooks(sched_root_task_t * __restrict root root->root_hooks.hook_exec.cancel = sched_hook_cancel; root->root_hooks.hook_exec.fetch = sched_hook_fetch; + root->root_hooks.hook_exec.exception = sched_hook_exception; root->root_hooks.hook_root.init = sched_hook_init; root->root_hooks.hook_root.fini = sched_hook_fini; @@ -139,7 +140,8 @@ schedInit(void ** __restrict data, size_t datlen) if (datlen) { root->root_data.iov_base = *data; root->root_data.iov_len = datlen; - } else { + } else { /* if datlen == 0, switch to callbacks init mode */ + /* little hack :) for correct initialization of scheduler */ func = (int(*)(sched_root_task_t*)) data; func(root); } @@ -283,7 +285,7 @@ schedCancel(sched_task_t * __restrict task) * @criteria = find task by criteria [CRITERIA_CALL|CRITERIA_ARG|CRITERIA_FD|CRITERIA_VAL|CRITERIA_TV] * @param = search parameter * @hook = custom cleanup hook function, may be NULL - * return: -1 error or 0 ok + * 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_queue_t * __restrict queue, @@ -322,7 +324,7 @@ schedCancelby(sched_root_task_t * __restrict root, sch break; } } else if (criteria == CRITERIA_FD) { - if (TASK_FD(task) == (u_long) param) { + if (TASK_FD(task) == (intptr_t) param) { flg++; break; } @@ -332,7 +334,7 @@ schedCancelby(sched_root_task_t * __restrict root, sch break; } } else if (criteria == CRITERIA_TV) { - if (&TASK_TV(task) == (struct timeval*) param) { + if (!timercmp(&TASK_TV(task), (struct timeval*) param, -)) { flg++; break; } @@ -362,10 +364,11 @@ schedCancelby(sched_root_task_t * __restrict root, sch /* * 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) +schedRun(sched_root_task_t * __restrict root, volatile intptr_t * __restrict killState) { sched_task_t *task; @@ -375,9 +378,16 @@ schedRun(sched_root_task_t * __restrict root) if (root->root_hooks.hook_exec.run) if (root->root_hooks.hook_exec.run(root, NULL)) return -1; - if (root->root_hooks.hook_exec.fetch) - while ((task = root->root_hooks.hook_exec.fetch(root, NULL))) - schedCall(task); + if (root->root_hooks.hook_exec.fetch) { + if (killState) + while (!*killState) { + if ((task = root->root_hooks.hook_exec.fetch(root, NULL))) + schedCall(task); + } + else + while ((task = root->root_hooks.hook_exec.fetch(root, NULL))) + schedCall(task); + } return 0; }