--- libaitsched/src/tasks.c 2014/01/28 13:17:33 1.23 +++ libaitsched/src/tasks.c 2014/06/03 20:39:54 1.24.2.4 @@ -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.24.2.4 2014/06/03 20:39:54 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,42 +89,27 @@ 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; + sched_root_task_t *r; - pthread_cleanup_push((void (*)(void*)) _sched_threadCleanup, t); - if (!t || !TASK_ROOT(t)) pthread_exit(ret); + else + r = (sched_root_task_t*) TASK_ROOT(t); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); /* @@ -139,41 +120,35 @@ _sched_threadWrapper(sched_task_t *t) pthread_testcancel(); ret = schedCall(t); + r->root_ret = ret; - pthread_cleanup_pop(42); - TASK_ROOT(t)->root_ret = ret; + if (TASK_VAL(t)) { + transit_task2unuse(t, &r->root_thread); + TASK_VAL(t) = 0; + } + pthread_exit(ret); } #endif -#if defined(HAVE_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME) +#if defined(HAVE_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME) && defined(HAVE_TIMER_DELETE) void * _sched_rtcWrapper(sched_task_t *t) { - sched_task_func_t func; sched_task_t *task; - sched_root_task_t *r; + void *ret; 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); + timer_delete((timer_t) TASK_DATLEN(t)); } -#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); + ret = schedCall(task); - timer_delete((timer_t) TASK_DATLEN(t)); - - return schedCall(task); + transit_task2unuse(task, &(TASK_ROOT(task))->root_rtc); + return ret; } #endif @@ -225,7 +200,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 +215,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 +248,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 +263,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 +286,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 +300,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 +315,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 +339,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 +353,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 +368,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 +392,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 +410,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 +425,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 +450,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 +464,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 +479,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 +503,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 +517,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 +532,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 +557,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 +571,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 +586,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 +611,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 +651,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 +670,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 +710,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 +729,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 +743,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 +758,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 +783,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 +841,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 +860,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 +918,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 +949,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 +977,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 +1021,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 +1036,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 +1070,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 +1086,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 +1126,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 +1141,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 +1174,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 +1211,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 +1230,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 +1242,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 +1278,7 @@ 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_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME) && defined(HAVE_TIMER_DELETE) sched_task_t *task; void *ptr; @@ -1392,7 +1289,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 +1304,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;