--- libaitsched/src/aitsched.c 2011/12/08 08:02:23 1.3 +++ libaitsched/src/aitsched.c 2012/01/08 02:01:41 1.4.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsched.c,v 1.3 2011/12/08 08:02:23 misho Exp $ +* $Id: aitsched.c,v 1.4.2.1 2012/01/08 02:01:41 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -122,12 +122,30 @@ schedInit(void ** __restrict data, size_t datlen) { sched_root_task_t *root = NULL; int (*func)(sched_root_task_t *); +#ifdef HAVE_LIBPTHREAD + register int i; +#endif root = malloc(sizeof(sched_root_task_t)); if (!root) { LOGERR; } else { memset(root, 0, sizeof(sched_root_task_t)); + +#ifdef HAVE_LIBPTHREAD + for (i = 0; i < taskMAX; i++) + if (pthread_mutex_init(&root->root_mtx[i], NULL)) { + LOGERR; + while (i) + pthread_mutex_destroy(&root->root_mtx[--i]); + free(root); + return NULL; + } + + for (i = 0; i < taskMAX; i++) + ROOT_QLOCK(root, i); +#endif + TAILQ_INIT(&root->root_read); TAILQ_INIT(&root->root_write); TAILQ_INIT(&root->root_timer); @@ -136,6 +154,11 @@ schedInit(void ** __restrict data, size_t datlen) TAILQ_INIT(&root->root_ready); TAILQ_INIT(&root->root_unuse); +#ifdef HAVE_LIBPTHREAD + for (i = 0; i < taskMAX; i++) + ROOT_QUNLOCK(root, i); +#endif + if (data && *data) { if (datlen) { root->root_data.iov_base = *data; @@ -163,10 +186,17 @@ int schedEnd(sched_root_task_t ** __restrict root) { sched_task_t *task; +#ifdef HAVE_LIBPTHREAD + register int i; +#endif if (!root || !*root) return -1; +#ifdef HAVE_LIBPTHREAD + for (i = 0; i < taskMAX; i++) + ROOT_QLOCK(*root, i); +#endif TAILQ_FOREACH(task, &(*root)->root_read, task_node) { schedCancel(task); } @@ -187,10 +217,19 @@ schedEnd(sched_root_task_t ** __restrict root) TAILQ_REMOVE(&(*root)->root_unuse, task, task_node); free(task); } +#ifdef HAVE_LIBPTHREAD + for (i = 0; i < taskMAX; i++) + ROOT_QUNLOCK(*root, i); +#endif if ((*root)->root_hooks.hook_root.fini) (*root)->root_hooks.hook_root.fini(*root, NULL); +#ifdef HAVE_LIBPTHREAD + for (i = 0; i < taskMAX; i++) + pthread_mutex_destroy(&(*root)->root_mtx[i]); +#endif + free(*root); *root = NULL; return 0; @@ -204,11 +243,19 @@ schedEnd(sched_root_task_t ** __restrict root) inline void * schedCall(sched_task_t * __restrict task) { + void *ptr = (void*) -1; + if (!task) - return (void*) -1; + return ptr; + if (!TASK_ISLOCKED(task)) + TASK_LOCK(task); + task->task_id++; - return task->task_func(task); + ptr = task->task_func(task); + + TASK_UNLOCK(task); + return ptr; } /* @@ -270,10 +317,8 @@ schedCancel(sched_task_t * __restrict task) } if (queue) TAILQ_REMOVE(queue, task, task_node); - if (task->task_type != taskUNUSE) { - task->task_type = taskUNUSE; - TAILQ_INSERT_TAIL(&task->task_root->root_unuse, task, task_node); - } + if (task->task_type != taskUNUSE) + _sched_unuseTask(task); return 0; } @@ -354,10 +399,8 @@ schedCancelby(sched_root_task_t * __restrict root, sch TAILQ_REMOVE(queue, task, task_node); - if (task->task_type != taskUNUSE) { - task->task_type = taskUNUSE; - TAILQ_INSERT_TAIL(&task->task_root->root_unuse, task, task_node); - } + if (task->task_type != taskUNUSE) + _sched_unuseTask(task); return 0; }