--- libaitsched/src/aitsched.c 2011/08/11 22:55:28 1.1.1.1.2.1 +++ libaitsched/src/aitsched.c 2011/09/09 14:14:33 1.1.1.1.2.5 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsched.c,v 1.1.1.1.2.1 2011/08/11 22:55:28 misho Exp $ +* $Id: aitsched.c,v 1.1.1.1.2.5 2011/09/09 14:14:33 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -127,13 +127,20 @@ schedInit(void ** __restrict data, size_t datlen) LOGERR; } else { memset(root, 0, sizeof(sched_root_task_t)); + TAILQ_INIT(&root->root_read); + TAILQ_INIT(&root->root_write); + TAILQ_INIT(&root->root_timer); + TAILQ_INIT(&root->root_event); + TAILQ_INIT(&root->root_eventlo); + TAILQ_INIT(&root->root_ready); + TAILQ_INIT(&root->root_unuse); if (data && *data) { if (datlen) { root->root_data.iov_base = *data; root->root_data.iov_len = datlen; } else { - func = *data; + func = (int(*)(sched_root_task_t*)) data; func(root); } } @@ -151,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; }