--- libaitsched/src/tasks.c 2014/01/28 13:17:33 1.23 +++ libaitsched/src/tasks.c 2015/07/02 22:38:28 1.25.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: tasks.c,v 1.23 2014/01/28 13:17:33 misho Exp $ +* $Id: tasks.c,v 1.25.2.1 2015/07/02 22:38:28 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -57,18 +57,14 @@ sched_useTask(sched_root_task_t * __restrict root) { sched_task_t *task, *tmp; -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskUNUSE]); -#endif + SCHED_QLOCK(root, taskUNUSE); TAILQ_FOREACH_SAFE(task, &root->root_unuse, task_node, tmp) { if (!TASK_ISLOCKED(task)) { TAILQ_REMOVE(&root->root_unuse, task, task_node); break; } } -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskUNUSE]); -#endif + SCHED_QUNLOCK(root, taskUNUSE); if (!task) { task = malloc(sizeof(sched_task_t)); @@ -93,92 +89,14 @@ sched_task_t * sched_unuseTask(sched_task_t * __restrict task) { TASK_UNLOCK(task); + TASK_TYPE(task) = taskUNUSE; -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&TASK_ROOT(task)->root_mtx[taskUNUSE]); -#endif - TAILQ_INSERT_TAIL(&TASK_ROOT(task)->root_unuse, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&TASK_ROOT(task)->root_mtx[taskUNUSE]); -#endif - task = NULL; + insert_task_to(task, &(TASK_ROOT(task))->root_unuse); + task = NULL; return task; } -#pragma GCC visibility push(hidden) - -#ifdef HAVE_LIBPTHREAD -static void -_sched_threadCleanup(sched_task_t *t) -{ - if (!t || !TASK_ROOT(t)) - return; - - pthread_mutex_lock(&TASK_ROOT(t)->root_mtx[taskTHREAD]); - TAILQ_REMOVE(&TASK_ROOT(t)->root_thread, t, task_node); - pthread_mutex_unlock(&TASK_ROOT(t)->root_mtx[taskTHREAD]); - sched_unuseTask(t); -} -void * -_sched_threadWrapper(sched_task_t *t) -{ - void *ret = NULL; - - pthread_cleanup_push((void (*)(void*)) _sched_threadCleanup, t); - - if (!t || !TASK_ROOT(t)) - pthread_exit(ret); - - pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); - /* - pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); - */ - - /* notify parent, thread is ready for execution */ - pthread_testcancel(); - - ret = schedCall(t); - - pthread_cleanup_pop(42); - TASK_ROOT(t)->root_ret = ret; - pthread_exit(ret); -} -#endif - -#if defined(HAVE_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME) -void * -_sched_rtcWrapper(sched_task_t *t) -{ - sched_task_func_t func; - sched_task_t *task; - sched_root_task_t *r; - - if (!t || !TASK_ROOT(t) || !TASK_DATA(t)) - return NULL; - else { - r = TASK_ROOT(t); - task = (sched_task_t*) TASK_DATA(t); - func = TASK_FUNC(task); - } - -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&r->root_mtx[taskRTC]); -#endif - TAILQ_REMOVE(&r->root_rtc, task, task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&r->root_mtx[taskRTC]); -#endif - sched_unuseTask(task); - - timer_delete((timer_t) TASK_DATLEN(t)); - - return schedCall(task); -} -#endif - -#pragma GCC visibility pop - /* * sched_taskExit() - Exit routine for scheduler task, explicit required for thread tasks * @@ -225,7 +143,7 @@ schedRead(sched_root_task_t * __restrict root, sched_t if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskREAD; TASK_ROOT(task) = root; @@ -240,15 +158,9 @@ schedRead(sched_root_task_t * __restrict root, sched_t else ptr = NULL; - if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskREAD]); -#endif - TAILQ_INSERT_TAIL(&root->root_read, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskREAD]); -#endif - } else + if (!ptr) + insert_task_to(task, &root->root_read); + else task = sched_unuseTask(task); return task; @@ -279,7 +191,7 @@ schedWrite(sched_root_task_t * __restrict root, sched_ if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskWRITE; TASK_ROOT(task) = root; @@ -294,15 +206,9 @@ schedWrite(sched_root_task_t * __restrict root, sched_ else ptr = NULL; - if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskWRITE]); -#endif - TAILQ_INSERT_TAIL(&root->root_write, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskWRITE]); -#endif - } else + if (!ptr) + insert_task_to(task, &root->root_write); + else task = sched_unuseTask(task); return task; @@ -323,7 +229,7 @@ sched_task_t * schedNode(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd, void *opt_data, size_t opt_dlen) { -#ifdef KQ_DISABLE +#if SUP_ENABLE != KQ_SUPPORT sched_SetErr(ENOTSUP, "disabled kqueue support"); return NULL; #else @@ -337,7 +243,7 @@ schedNode(sched_root_task_t * __restrict root, sched_t if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskNODE; TASK_ROOT(task) = root; @@ -352,19 +258,13 @@ schedNode(sched_root_task_t * __restrict root, sched_t else ptr = NULL; - if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskNODE]); -#endif - TAILQ_INSERT_TAIL(&root->root_node, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskNODE]); -#endif - } else + if (!ptr) + insert_task_to(task, &root->root_node); + else task = sched_unuseTask(task); return task; -#endif /* KQ_DISABLE */ +#endif /* KQ_SUPPORT */ } /* @@ -382,7 +282,7 @@ sched_task_t * schedProc(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, u_long pid, void *opt_data, size_t opt_dlen) { -#ifdef KQ_DISABLE +#if SUP_ENABLE != KQ_SUPPORT sched_SetErr(ENOTSUP, "disabled kqueue support"); return NULL; #else @@ -396,7 +296,7 @@ schedProc(sched_root_task_t * __restrict root, sched_t if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskPROC; TASK_ROOT(task) = root; @@ -411,19 +311,13 @@ schedProc(sched_root_task_t * __restrict root, sched_t else ptr = NULL; - if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskPROC]); -#endif - TAILQ_INSERT_TAIL(&root->root_proc, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskPROC]); -#endif - } else + if (!ptr) + insert_task_to(task, &root->root_proc); + else task = sched_unuseTask(task); return task; -#endif /* KQ_DISABLE */ +#endif /* KQ_SUPPORT */ } /* @@ -441,7 +335,7 @@ sched_task_t * schedUser(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, u_long id, void *opt_data, size_t opt_dlen) { -#ifdef KQ_DISABLE +#if SUP_ENABLE != KQ_SUPPORT sched_SetErr(ENOTSUP, "disabled kqueue support"); return NULL; #else @@ -459,7 +353,7 @@ schedUser(sched_root_task_t * __restrict root, sched_t if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskUSER; TASK_ROOT(task) = root; @@ -474,20 +368,14 @@ schedUser(sched_root_task_t * __restrict root, sched_t else ptr = NULL; - if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskUSER]); -#endif - TAILQ_INSERT_TAIL(&root->root_user, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskUSER]); -#endif - } else + if (!ptr) + insert_task_to(task, &root->root_user); + else task = sched_unuseTask(task); return task; #endif /* EVFILT_USER */ -#endif /* KQ_DISABLE */ +#endif /* KQ_SUPPORT */ } /* @@ -505,7 +393,7 @@ sched_task_t * schedSignal(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, u_long sig, void *opt_data, size_t opt_dlen) { -#ifdef KQ_DISABLE +#if SUP_ENABLE != KQ_SUPPORT sched_SetErr(ENOTSUP, "disabled kqueue support"); return NULL; #else @@ -519,7 +407,7 @@ schedSignal(sched_root_task_t * __restrict root, sched if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskSIGNAL; TASK_ROOT(task) = root; @@ -534,19 +422,13 @@ schedSignal(sched_root_task_t * __restrict root, sched else ptr = NULL; - if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskSIGNAL]); -#endif - TAILQ_INSERT_TAIL(&root->root_signal, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskSIGNAL]); -#endif - } else + if (!ptr) + insert_task_to(task, &root->root_signal); + else task = sched_unuseTask(task); return task; -#endif /* KQ_DISABLE */ +#endif /* KQ_SUPPORT */ } /* @@ -564,7 +446,7 @@ sched_task_t * schedAlarm(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, struct timespec ts, void *opt_data, size_t opt_dlen) { -#ifdef KQ_DISABLE +#if SUP_ENABLE != KQ_SUPPORT sched_SetErr(ENOTSUP, "disabled kqueue support"); return NULL; #else @@ -578,7 +460,7 @@ schedAlarm(sched_root_task_t * __restrict root, sched_ if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskALARM; TASK_ROOT(task) = root; @@ -593,19 +475,13 @@ schedAlarm(sched_root_task_t * __restrict root, sched_ else ptr = NULL; - if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskALARM]); -#endif - TAILQ_INSERT_TAIL(&root->root_alarm, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskALARM]); -#endif - } else + if (!ptr) + insert_task_to(task, &root->root_alarm); + else task = sched_unuseTask(task); return task; -#endif /* KQ_DISABLE */ +#endif /* KQ_SUPPORT */ } #ifdef AIO_SUPPORT @@ -624,7 +500,7 @@ sched_task_t * schedAIO(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, struct aiocb * __restrict acb, void *opt_data, size_t opt_dlen) { -#ifdef KQ_DISABLE +#if SUP_ENABLE != KQ_SUPPORT sched_SetErr(ENOTSUP, "disabled kqueue support"); return NULL; #else @@ -638,7 +514,7 @@ schedAIO(sched_root_task_t * __restrict root, sched_ta if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskAIO; TASK_ROOT(task) = root; @@ -653,19 +529,13 @@ schedAIO(sched_root_task_t * __restrict root, sched_ta else ptr = NULL; - if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskAIO]); -#endif - TAILQ_INSERT_TAIL(&root->root_aio, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskAIO]); -#endif - } else + if (!ptr) + insert_task_to(task, &root->root_aio); + else task = sched_unuseTask(task); return task; -#endif /* KQ_DISABLE */ +#endif /* KQ_SUPPORT */ } /* @@ -684,7 +554,7 @@ sched_task_t * schedAIORead(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd, void *buffer, size_t buflen, off_t offset) { -#ifdef KQ_DISABLE +#if SUP_ENABLE != KQ_SUPPORT sched_SetErr(ENOTSUP, "disabled kqueue support"); return NULL; #else @@ -724,7 +594,7 @@ schedAIORead(sched_root_task_t * __restrict root, sche } return schedAIO(root, func, arg, acb, buffer, buflen); -#endif /* KQ_DISABLE */ +#endif /* KQ_SUPPORT */ } /* @@ -743,7 +613,7 @@ sched_task_t * schedAIOWrite(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd, void *buffer, size_t buflen, off_t offset) { -#ifdef KQ_DISABLE +#if SUP_ENABLE != KQ_SUPPORT sched_SetErr(ENOTSUP, "disabled kqueue support"); return NULL; #else @@ -783,7 +653,7 @@ schedAIOWrite(sched_root_task_t * __restrict root, sch } return schedAIO(root, func, arg, acb, buffer, buflen); -#endif /* KQ_DISABLE */ +#endif /* KQ_SUPPORT */ } #ifdef EVFILT_LIO @@ -802,7 +672,7 @@ sched_task_t * schedLIO(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, struct aiocb ** __restrict acbs, void *opt_data, size_t opt_dlen) { -#ifdef KQ_DISABLE +#if SUP_ENABLE != KQ_SUPPORT sched_SetErr(ENOTSUP, "disabled kqueue support"); return NULL; #else @@ -816,7 +686,7 @@ schedLIO(sched_root_task_t * __restrict root, sched_ta if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskLIO; TASK_ROOT(task) = root; @@ -831,19 +701,13 @@ schedLIO(sched_root_task_t * __restrict root, sched_ta else ptr = NULL; - if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskLIO]); -#endif - TAILQ_INSERT_TAIL(&root->root_lio, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskLIO]); -#endif - } else + if (!ptr) + insert_task_to(task, &root->root_lio); + else task = sched_unuseTask(task); return task; -#endif /* KQ_DISABLE */ +#endif /* KQ_SUPPORT */ } /* @@ -862,7 +726,7 @@ sched_task_t * schedLIORead(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd, struct iovec *bufs, size_t nbufs, off_t offset) { -#ifdef KQ_DISABLE +#if SUP_ENABLE != KQ_SUPPORT sched_SetErr(ENOTSUP, "disabled kqueue support"); return NULL; #else @@ -920,7 +784,7 @@ schedLIORead(sched_root_task_t * __restrict root, sche } return schedLIO(root, func, arg, (void*) acb, bufs, nbufs); -#endif /* KQ_DISABLE */ +#endif /* KQ_SUPPORT */ } /* @@ -939,7 +803,7 @@ sched_task_t * schedLIOWrite(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd, struct iovec *bufs, size_t nbufs, off_t offset) { -#ifdef KQ_DISABLE +#if SUP_ENABLE != KQ_SUPPORT sched_SetErr(ENOTSUP, "disabled kqueue support"); return NULL; #else @@ -997,7 +861,7 @@ schedLIOWrite(sched_root_task_t * __restrict root, sch } return schedLIO(root, func, arg, (void*) acb, bufs, nbufs); -#endif /* KQ_DISABLE */ +#endif /* KQ_SUPPORT */ } #endif /* EVFILT_LIO */ #endif /* AIO_SUPPORT */ @@ -1028,7 +892,7 @@ schedTimer(sched_root_task_t * __restrict root, sched_ if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskTIMER; TASK_ROOT(task) = root; @@ -1056,23 +920,19 @@ schedTimer(sched_root_task_t * __restrict root, sched_ ptr = NULL; if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskTIMER]); -#endif + SCHED_QLOCK(root, taskTIMER); #ifdef TIMER_WITHOUT_SORT - TAILQ_INSERT_TAIL(&root->root_timer, TASK_ID(task), task_node); + TAILQ_INSERT_TAIL(&root->root_timer, task, task_node); #else TAILQ_FOREACH_SAFE(t, &root->root_timer, task_node, tmp) if (sched_timespeccmp(&TASK_TS(task), &TASK_TS(t), -) < 1) break; if (!t) - TAILQ_INSERT_TAIL(&root->root_timer, TASK_ID(task), task_node); + TAILQ_INSERT_TAIL(&root->root_timer, task, task_node); else - TAILQ_INSERT_BEFORE(t, TASK_ID(task), task_node); + TAILQ_INSERT_BEFORE(t, task, task_node); #endif -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskTIMER]); -#endif + SCHED_QUNLOCK(root, taskTIMER); } else task = sched_unuseTask(task); @@ -1104,7 +964,7 @@ schedEvent(sched_root_task_t * __restrict root, sched_ if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskEVENT; TASK_ROOT(task) = root; @@ -1119,15 +979,9 @@ schedEvent(sched_root_task_t * __restrict root, sched_ else ptr = NULL; - if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskEVENT]); -#endif - TAILQ_INSERT_TAIL(&root->root_event, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskEVENT]); -#endif - } else + if (!ptr) + insert_task_to(task, &root->root_event); + else task = sched_unuseTask(task); return task; @@ -1159,7 +1013,7 @@ schedTask(sched_root_task_t * __restrict root, sched_t if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskTASK; TASK_ROOT(task) = root; @@ -1175,19 +1029,15 @@ schedTask(sched_root_task_t * __restrict root, sched_t ptr = NULL; if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskTASK]); -#endif + SCHED_QLOCK(root, taskTASK); TAILQ_FOREACH_SAFE(t, &root->root_task, task_node, tmp) if (TASK_VAL(task) < TASK_VAL(t)) break; if (!t) - TAILQ_INSERT_TAIL(&root->root_task, TASK_ID(task), task_node); + TAILQ_INSERT_TAIL(&root->root_task, task, task_node); else - TAILQ_INSERT_BEFORE(t, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskTASK]); -#endif + TAILQ_INSERT_BEFORE(t, task, task_node); + SCHED_QUNLOCK(root, taskTASK); } else task = sched_unuseTask(task); @@ -1219,7 +1069,7 @@ schedSuspend(sched_root_task_t * __restrict root, sche if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskSUSPEND; TASK_ROOT(task) = root; @@ -1234,15 +1084,9 @@ schedSuspend(sched_root_task_t * __restrict root, sche else ptr = NULL; - if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskSUSPEND]); -#endif - TAILQ_INSERT_TAIL(&root->root_suspend, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskSUSPEND]); -#endif - } else + if (!ptr) + insert_task_to(task, &root->root_suspend); + else task = sched_unuseTask(task); return task; @@ -1273,7 +1117,7 @@ schedCallOnce(sched_root_task_t * __restrict root, sch if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskEVENT; TASK_ROOT(task) = root; @@ -1310,17 +1154,16 @@ schedThread(sched_root_task_t * __restrict root, sched #endif sched_task_t *task; pthread_attr_t attr; + void *ptr; if (!root || !func) return NULL; /* get new task */ - if (!(task = sched_useTask(root))) { - + if (!(task = sched_useTask(root))) return NULL; - } - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskTHREAD; TASK_ROOT(task) = root; @@ -1330,7 +1173,7 @@ schedThread(sched_root_task_t * __restrict root, sched TASK_DATLEN(task) = opt_dlen; pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_DETACHED); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (ss && (errno = pthread_attr_setstacksize(&attr, ss))) { LOGERR; pthread_attr_destroy(&attr); @@ -1342,26 +1185,23 @@ schedThread(sched_root_task_t * __restrict root, sched return sched_unuseTask(task); } else TASK_FLAG(task) = ss; - if ((errno = pthread_attr_setguardsize(&attr, ss))) { - LOGERR; - pthread_attr_destroy(&attr); - return sched_unuseTask(task); - } + #ifdef SCHED_RR pthread_attr_setschedpolicy(&attr, SCHED_RR); #else pthread_attr_setschedpolicy(&attr, SCHED_OTHER); #endif - pthread_mutex_lock(&root->root_mtx[taskTHREAD]); - TAILQ_INSERT_TAIL(&root->root_thread, TASK_ID(task), task_node); - pthread_mutex_unlock(&root->root_mtx[taskTHREAD]); - if (root->root_hooks.hook_add.thread) - if (root->root_hooks.hook_add.thread(task, &attr)) { - schedCancel(task); - task = NULL; - } + ptr = root->root_hooks.hook_add.thread(task, &attr); + else + ptr = NULL; + + if (!ptr) + insert_task_to(task, &root->root_thread); + else + task = sched_unuseTask(task); + pthread_attr_destroy(&attr); return task; } @@ -1381,7 +1221,8 @@ sched_task_t * schedRTC(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, struct timespec ts, void *opt_data, size_t opt_dlen) { -#if defined(HAVE_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME) +#if defined(HAVE_LIBRT) && defined(HAVE_TIMER_CREATE) && \ + defined(HAVE_TIMER_SETTIME) && defined(HAVE_TIMER_DELETE) sched_task_t *task; void *ptr; @@ -1392,7 +1233,7 @@ schedRTC(sched_root_task_t * __restrict root, sched_ta if (!(task = sched_useTask(root))) return NULL; - task->task_func = func; + TASK_FUNC(task) = func; TASK_TYPE(task) = taskRTC; TASK_ROOT(task) = root; @@ -1407,15 +1248,9 @@ schedRTC(sched_root_task_t * __restrict root, sched_ta else ptr = NULL; - if (!ptr) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskRTC]); -#endif - TAILQ_INSERT_TAIL(&root->root_rtc, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskRTC]); -#endif - } else + if (!ptr) + insert_task_to(task, &root->root_rtc); + else task = sched_unuseTask(task); return task;