|
|
| version 1.13, 2012/08/21 12:54:39 | version 1.13.2.3, 2012/08/22 23:43:36 |
|---|---|
| Line 106 sched_unuseTask(sched_task_t * __restrict task) | Line 106 sched_unuseTask(sched_task_t * __restrict task) |
| return task; | return task; |
| } | } |
| #pragma GCC visibility push(hidden) | |
| void * | |
| _sched_threadJoin(sched_task_t *task) | |
| { | |
| void *ret = NULL; | |
| if (!task) | |
| return NULL; | |
| #ifdef HAVE_LIBPTHREAD | |
| if (pthread_kill((pthread_t) TASK_VAL(task), 0)) { | |
| pthread_join((pthread_t) TASK_VAL(task), &ret); | |
| TASK_ROOT(task)->root_ret = ret; | |
| } else { | |
| usleep(10000); | |
| schedTaskSelf(task); | |
| } | |
| #endif | |
| return NULL; | |
| } | |
| #pragma GCC visibility pop | |
| /* | /* |
| * 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 | * schedRead() - Add READ I/O task to scheduler queue |
| * | * |
| * @root = root task | * @root = root task |
| Line 1176 schedThread(sched_root_task_t * __restrict root, sched | Line 1232 schedThread(sched_root_task_t * __restrict root, sched |
| TASK_ROOT(task) = root; | TASK_ROOT(task) = root; |
| TASK_ARG(task) = arg; | TASK_ARG(task) = arg; |
| TASK_FLAG(task) = detach ? PTHREAD_CREATE_DETACHED : PTHREAD_CREATE_JOINABLE; | |
| TASK_DATA(task) = opt_data; | TASK_DATA(task) = opt_data; |
| TASK_DATLEN(task) = opt_dlen; | TASK_DATLEN(task) = opt_dlen; |
| pthread_attr_init(&attr); | pthread_attr_init(&attr); |
| pthread_attr_setdetachstate(&attr, detach ? | pthread_attr_setdetachstate(&attr, TASK_FLAG(task)); |
| PTHREAD_CREATE_DETACHED : PTHREAD_CREATE_JOINABLE); | |
| if (root->root_hooks.hook_add.thread) | if (root->root_hooks.hook_add.thread) |
| ptr = root->root_hooks.hook_add.thread(task, &attr); | ptr = root->root_hooks.hook_add.thread(task, &attr); |
| else | else |