--- libaitsched/src/tasks.c 2014/05/21 22:09:01 1.24.2.3 +++ 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.24.2.3 2014/05/21 22:09:01 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) && 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; - - 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; @@ -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,15 +258,9 @@ 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; @@ -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,15 +311,9 @@ 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; @@ -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,15 +368,9 @@ 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; @@ -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,15 +422,9 @@ 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; @@ -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,15 +475,9 @@ 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; @@ -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,15 +529,9 @@ 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; @@ -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,15 +701,9 @@ 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; @@ -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; @@ -1349,15 +1192,16 @@ schedThread(sched_root_task_t * __restrict root, sched 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; } @@ -1377,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) && defined(HAVE_TIMER_DELETE) +#if defined(HAVE_LIBRT) && defined(HAVE_TIMER_CREATE) && \ + defined(HAVE_TIMER_SETTIME) && defined(HAVE_TIMER_DELETE) sched_task_t *task; void *ptr; @@ -1388,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; @@ -1403,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;