--- libaitsched/src/tasks.c 2012/08/21 12:54:39 1.13 +++ libaitsched/src/tasks.c 2012/08/22 10:33:45 1.13.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: tasks.c,v 1.13 2012/08/21 12:54:39 misho Exp $ +* $Id: tasks.c,v 1.13.2.1 2012/08/22 10:33:45 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -106,8 +106,55 @@ sched_unuseTask(sched_task_t * __restrict task) return task; } +void * +_sched_threadJoin(sched_task_t *task) +{ + void *ret = NULL; + if (!task) + return NULL; + +#ifdef HAVE_LIBPTHREAD + pthread_join((pthread_t) TASK_VAL(task), &ret); + TASK_ROOT(task)->root_ret = ret; +#endif + + return NULL; +} + /* + * sched_taskExit() - Exit routine for scheduler task, explicit required for thread tasks + * + * @task = current task + * @retcode = return code + * return: return code + */ +inline void * +sched_taskExit(sched_task_t *task, intptr_t retcode) +{ + if (!task || !TASK_ROOT(task)) + return (void*) -1; + + if (TASK_ROOT(task)->root_hooks.hook_exec.exit) + TASK_ROOT(task)->root_hooks.hook_exec.exit(task, (void*) retcode); + + TASK_ROOT(task)->root_ret = (void*) retcode; + +#ifdef HAVE_LIBPTHREAD + if (TASK_TYPE(task) == taskTHREAD) { + if (TASK_FLAG(task) == PTHREAD_CREATE_JOINABLE) /* joinable thread */ + schedTask(TASK_ROOT(task), _sched_threadJoin, TASK_ARG(task), + TASK_VAL(task), TASK_DATA(task), TASK_DATLEN(task)); + sched_unuseTask(task); + pthread_exit((void*) retcode); + } +#endif + + return (void*) retcode; +} + + +/* * schedRead() - Add READ I/O task to scheduler queue * * @root = root task @@ -1176,13 +1223,13 @@ schedThread(sched_root_task_t * __restrict root, sched TASK_ROOT(task) = root; TASK_ARG(task) = arg; + TASK_FLAG(task) = detach ? PTHREAD_CREATE_DETACHED : PTHREAD_CREATE_JOINABLE; TASK_DATA(task) = opt_data; TASK_DATLEN(task) = opt_dlen; pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, detach ? - PTHREAD_CREATE_DETACHED : PTHREAD_CREATE_JOINABLE); + pthread_attr_setdetachstate(&attr, TASK_FLAG(task)); if (root->root_hooks.hook_add.thread) ptr = root->root_hooks.hook_add.thread(task, &attr); else