--- libaitsched/src/aitsched.c 2012/03/13 10:01:59 1.6 +++ libaitsched/src/aitsched.c 2012/05/10 15:30:18 1.6.2.5 @@ -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.5 2012/05/10 15:30:18 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); @@ -191,7 +190,7 @@ schedInit(void ** __restrict data, size_t datlen) int schedEnd(sched_root_task_t ** __restrict root) { - sched_task_t *task; + sched_task_t *task, *tmp; #ifdef HAVE_LIBPTHREAD register int i; #endif @@ -199,22 +198,22 @@ schedEnd(sched_root_task_t ** __restrict root) if (!root || !*root) return -1; - TAILQ_FOREACH(task, &(*root)->root_read, task_node) { + TAILQ_FOREACH_SAFE(task, &(*root)->root_read, task_node, tmp) { schedCancel(task); } - TAILQ_FOREACH(task, &(*root)->root_write, task_node) { + TAILQ_FOREACH_SAFE(task, &(*root)->root_write, task_node, tmp) { schedCancel(task); } - TAILQ_FOREACH(task, &(*root)->root_timer, task_node) { + TAILQ_FOREACH_SAFE(task, &(*root)->root_timer, task_node, tmp) { schedCancel(task); } - TAILQ_FOREACH(task, &(*root)->root_event, task_node) { + TAILQ_FOREACH_SAFE(task, &(*root)->root_event, task_node, tmp) { schedCancel(task); } - TAILQ_FOREACH(task, &(*root)->root_eventlo, task_node) { + TAILQ_FOREACH_SAFE(task, &(*root)->root_eventlo, task_node, tmp) { schedCancel(task); } - TAILQ_FOREACH(task, &(*root)->root_ready, task_node) { + TAILQ_FOREACH_SAFE(task, &(*root)->root_ready, task_node, tmp) { schedCancel(task); } @@ -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; }