--- libaitsched/src/aitsched.c 2012/03/13 10:01:59 1.6 +++ libaitsched/src/aitsched.c 2012/05/03 15:05:09 1.6.2.4 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsched.c,v 1.6 2012/03/13 10:01:59 misho Exp $ +* $Id: aitsched.c,v 1.6.2.4 2012/05/03 15:05:09 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -93,8 +93,7 @@ sched_SetErr(int eno, char *estr, ...) int schedRegisterHooks(sched_root_task_t * __restrict root) { - if (!root || (root->root_data.iov_base && root->root_data.iov_len)) - return -1; + assert(root); if (root->root_hooks.hook_root.fini) root->root_hooks.hook_root.fini(root, NULL); @@ -471,7 +470,7 @@ schedCancelby(sched_root_task_t * __restrict root, sch * return: -1 error or 0 ok */ int -schedRun(sched_root_task_t * __restrict root, volatile intptr_t * __restrict killState) +schedRun(sched_root_task_t *root, volatile intptr_t * __restrict killState) { sched_task_t *task; @@ -481,22 +480,27 @@ schedRun(sched_root_task_t * __restrict root, volatile 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) { - if (killState) { - if (root->root_hooks.hook_exec.condition) - while (root->root_hooks.hook_exec.condition(root, (void*) killState)) { - if ((task = root->root_hooks.hook_exec.fetch(root, NULL))) - schedCall(task); - } - else - 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))) + + if (killState) { + if (root->root_hooks.hook_exec.condition) + /* condition scheduler loop */ + while (root && root->root_hooks.hook_exec.fetch && + root->root_hooks.hook_exec.condition && + root->root_hooks.hook_exec.condition(root, (void*) killState)) { + if ((task = root->root_hooks.hook_exec.fetch(root, NULL))) + schedCall(task); + } + else + /* trigger scheduler loop */ + while (!*killState && root && root->root_hooks.hook_exec.fetch) { + if ((task = root->root_hooks.hook_exec.fetch(root, NULL))) + schedCall(task); + } + } else + /* infinite scheduler loop */ + while (root && root->root_hooks.hook_exec.fetch) + if ((task = root->root_hooks.hook_exec.fetch(root, NULL))) schedCall(task); - } return 0; }