--- libaitsched/src/aitsched.c 2014/05/19 23:35:40 1.25.2.2 +++ libaitsched/src/aitsched.c 2015/07/02 22:45:00 1.27 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsched.c,v 1.25.2.2 2014/05/19 23:35:40 misho Exp $ +* $Id: aitsched.c,v 1.27 2015/07/02 22:45:00 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004 - 2014 +Copyright 2004 - 2015 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -174,16 +174,18 @@ schedRegisterHooks(sched_root_task_t * __restrict root root->root_hooks.hook_add.read = sched_hook_read; root->root_hooks.hook_add.write = sched_hook_write; - root->root_hooks.hook_add.alarm = sched_hook_alarm; #if defined(HAVE_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME) && defined(HAVE_TIMER_DELETE) root->root_hooks.hook_add.rtc = sched_hook_rtc; #endif +#if SUP_ENABLE == KQ_SUPPORT + root->root_hooks.hook_add.alarm = sched_hook_alarm; root->root_hooks.hook_add.node = sched_hook_node; root->root_hooks.hook_add.proc = sched_hook_proc; root->root_hooks.hook_add.signal = sched_hook_signal; #ifdef EVFILT_USER root->root_hooks.hook_add.user = sched_hook_user; #endif +#endif /* KQ_SUPPORT */ #ifdef HAVE_LIBPTHREAD root->root_hooks.hook_add.thread = sched_hook_thread; #endif @@ -297,7 +299,45 @@ schedEnd(sched_root_task_t ** __restrict root) if (!root || !*root) return -1; +#if 0 TAILQ_FOREACH_SAFE(task, &(*root)->root_read, task_node, tmp) + printf("read=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_write, task_node, tmp) + printf("write=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_timer, task_node, tmp) + printf("timer=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_alarm, task_node, tmp) + printf("alarm=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_rtc, task_node, tmp) + printf("rtc=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_node, task_node, tmp) + printf("node=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_proc, task_node, tmp) + printf("proc=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_signal, task_node, tmp) + printf("signal=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_aio, task_node, tmp) + printf("aio=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_lio, task_node, tmp) + printf("lio=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_user, task_node, tmp) + printf("user=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_event, task_node, tmp) + printf("event=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_suspend, task_node, tmp) + printf("suspend=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_ready, task_node, tmp) + printf("ready=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_thread, task_node, tmp) + printf("thread=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_task, task_node, tmp) + printf("task=%p\n", task); + TAILQ_FOREACH_SAFE(task, &(*root)->root_unuse, task_node, tmp) + printf("unuse=%p\n", task); + fflush(stdout); +#endif + + TAILQ_FOREACH_SAFE(task, &(*root)->root_read, task_node, tmp) schedCancel(task); TAILQ_FOREACH_SAFE(task, &(*root)->root_write, task_node, tmp) schedCancel(task); @@ -330,23 +370,21 @@ schedEnd(sched_root_task_t ** __restrict root) TAILQ_FOREACH_SAFE(task, &(*root)->root_task, task_node, tmp) schedCancel(task); -#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) { TAILQ_REMOVE(&(*root)->root_unuse, task, task_node); free(task); } -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&(*root)->root_mtx[taskUNUSE]); -#endif + SCHED_QUNLOCK((*root), taskUNUSE); if ((*root)->root_hooks.hook_root.fini) (*root)->root_hooks.hook_root.fini(*root, NULL); #ifdef HAVE_LIBPTHREAD - for (i = 0; i < taskMAX; i++) + for (i = 0; i < taskMAX; i++) { + SCHED_QUNLOCK(*root, i); pthread_mutex_destroy(&(*root)->root_mtx[i]); + } #endif free(*root); @@ -434,7 +472,7 @@ schedTrigger(sched_task_t * __restrict task) return 0; #endif -#endif /* KQ_DISABLE */ +#endif /* KQ_SUPPORT */ } /* @@ -737,15 +775,8 @@ schedCancel(sched_task_t * __restrict task) default: queue = NULL; } - if (queue) { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&TASK_ROOT(task)->root_mtx[TASK_TYPE(task)]); -#endif - TAILQ_REMOVE(queue, TASK_ID(task), task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&TASK_ROOT(task)->root_mtx[TASK_TYPE(task)]); -#endif - } + if (queue) + remove_task_from(task, queue); if (TASK_TYPE(task) != taskUNUSE) sched_unuseTask(task); @@ -864,9 +895,7 @@ schedCancelby(sched_root_task_t * __restrict root, sch return 0; } -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[type]); -#endif + SCHED_QLOCK(root, type); TAILQ_FOREACH_SAFE(task, queue, task_node, tmp) { flg ^= flg; switch (criteria) { @@ -929,9 +958,8 @@ schedCancelby(sched_root_task_t * __restrict root, sch flg ^= flg; /* ok */ } } -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[type]); -#endif + SCHED_QUNLOCK(root, type); + return flg; } @@ -1012,12 +1040,12 @@ schedPolling(sched_root_task_t * __restrict root, stru * return: -1 error or 0 ok */ int -schedTermCondition(sched_root_task_t * __restrict root, intptr_t condValue) +schedTermCondition(sched_root_task_t * __restrict root, intptr_t * __restrict condValue) { - if (!root) + if (!root && !condValue) return -1; - root->root_cond = condValue; + *root->root_cond = *condValue; root->root_hooks.hook_exec.condition = sched_hook_condition; return 0; } @@ -1040,9 +1068,7 @@ schedResumeby(sched_root_task_t * __restrict root, u_c if (!root) return -1; -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskSUSPEND]); -#endif + SCHED_QLOCK(root, taskSUSPEND); TAILQ_FOREACH_SAFE(task, &root->root_suspend, task_node, tmp) { flg ^= flg; switch (criteria) { @@ -1075,20 +1101,12 @@ schedResumeby(sched_root_task_t * __restrict root, u_c TAILQ_REMOVE(&root->root_suspend, task, task_node); task->task_type = taskREADY; -#ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&root->root_mtx[taskREADY]); -#endif - TAILQ_INSERT_TAIL(&root->root_ready, task, task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskREADY]); -#endif + insert_task_to(task, &root->root_ready); flg ^= flg; /* ok */ } } -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[taskSUSPEND]); -#endif + SCHED_QUNLOCK(root, taskSUSPEND); return flg; }