--- libaitsched/src/aitsched.c 2011/08/13 17:28:17 1.1.1.1.2.4 +++ libaitsched/src/aitsched.c 2011/10/04 12:32:23 1.1.1.1.2.7 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsched.c,v 1.1.1.1.2.4 2011/08/13 17:28:17 misho Exp $ +* $Id: aitsched.c,v 1.1.1.1.2.7 2011/10/04 12:32:23 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -158,38 +158,39 @@ schedInit(void ** __restrict data, size_t datlen) * return: -1 error or 0 ok */ int -schedEnd(sched_root_task_t * __restrict root) +schedEnd(sched_root_task_t ** __restrict root) { sched_task_t *task; - if (!root) + if (!root || !*root) return -1; - TAILQ_FOREACH(task, &root->root_read, task_node) { + TAILQ_FOREACH(task, &(*root)->root_read, task_node) { schedCancel(task); } - TAILQ_FOREACH(task, &root->root_write, task_node) { + TAILQ_FOREACH(task, &(*root)->root_write, task_node) { schedCancel(task); } - TAILQ_FOREACH(task, &root->root_timer, task_node) { + TAILQ_FOREACH(task, &(*root)->root_timer, task_node) { schedCancel(task); } - TAILQ_FOREACH(task, &root->root_event, task_node) { + TAILQ_FOREACH(task, &(*root)->root_event, task_node) { schedCancel(task); } - TAILQ_FOREACH(task, &root->root_ready, task_node) { + TAILQ_FOREACH(task, &(*root)->root_ready, task_node) { schedCancel(task); } - while ((task = TAILQ_FIRST(&root->root_unuse))) { - TAILQ_REMOVE(&root->root_unuse, task, task_node); + while ((task = TAILQ_FIRST(&(*root)->root_unuse))) { + TAILQ_REMOVE(&(*root)->root_unuse, task, task_node); free(task); } - if (root->root_hooks.hook_root.fini) - root->root_hooks.hook_root.fini(root, NULL); + if ((*root)->root_hooks.hook_root.fini) + (*root)->root_hooks.hook_root.fini(*root, NULL); - free(root); + free(*root); + *root = NULL; return 0; } @@ -321,7 +322,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) == (int) param) { flg++; break; } @@ -361,10 +362,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; @@ -374,9 +376,14 @@ 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 && (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; }