--- libaitsched/src/aitsched.c 2012/05/14 12:09:13 1.7 +++ libaitsched/src/aitsched.c 2012/05/19 00:46:53 1.8 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsched.c,v 1.7 2012/05/14 12:09:13 misho Exp $ +* $Id: aitsched.c,v 1.8 2012/05/19 00:46:53 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -347,7 +347,7 @@ schedCancel(sched_task_t * __restrict task) * * @root = root task * @type = cancel from queue type, if =taskMAX cancel same task from all queues - * @criteria = find task by criteria [CRITERIA_CALL|CRITERIA_ARG|CRITERIA_FD|CRITERIA_VAL|CRITERIA_TV] + * @criteria = find task by criteria [CRITERIA_CALL|CRITERIA_ARG|CRITERIA_FD|CRITERIA_VAL|CRITERIA_TS] * @param = search parameter * @hook = custom cleanup hook function, may be NULL * return: -1 error, -2 error in sub-stage cancel execution, -3 error from custom hook or 0 ok @@ -356,9 +356,9 @@ int schedCancelby(sched_root_task_t * __restrict root, sched_task_type_t type, u_char criteria, void *param, sched_hook_func_t hook) { - sched_task_t *task; + sched_task_t *task, *tmp; sched_queue_t *queue; - int flg = 0; + register int flg = 0; if (!root) return -1; @@ -403,63 +403,60 @@ schedCancelby(sched_root_task_t * __restrict root, sch #ifdef HAVE_LIBPTHREAD pthread_mutex_lock(&root->root_mtx[type]); #endif - TAILQ_FOREACH(task, queue, task_node) - if (criteria == CRITERIA_CALL) { - if (task->task_func == (sched_task_func_t) param) { - flg++; + TAILQ_FOREACH_SAFE(task, queue, task_node, tmp) { + flg ^= flg; + switch (criteria) { + case CRITERIA_CALL: + if (TASK_FUNC(task) == (sched_task_func_t) param) + flg = 1; break; - } - } else if (criteria == CRITERIA_ARG) { - if (task->task_arg == param) { - flg++; + case CRITERIA_ARG: + if (TASK_ARG(task) == param) + flg = 1; break; - } - } else if (criteria == CRITERIA_FD) { - if (TASK_FD(task) == (intptr_t) param) { - flg++; + case CRITERIA_FD: + if (TASK_FD(task) == (intptr_t) param) + flg = 1; break; - } - } else if (criteria == CRITERIA_VAL) { - if (TASK_VAL(task) == (u_long) param) { - flg++; + case CRITERIA_VAL: + if (TASK_VAL(task) == (u_long) param) + flg = 1; break; - } - } else if (criteria == CRITERIA_TV) { - if (!sched_timespeccmp(&TASK_TS(task), (struct timespec*) param, -)) { - flg++; + case CRITERIA_TS: + if (!sched_timespeccmp(&TASK_TS(task), (struct timespec*) param, -)) + flg = 1; break; - } - } else { -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[type]); -#endif - sched_SetErr(EINVAL, "Invalid parameter criteria %d", criteria); - return -1; + default: + sched_SetErr(EINVAL, "Invalid parameter criteria %d", criteria); + flg = -1; } -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&root->root_mtx[type]); -#endif - if (!flg || !task) /* task not found */ - return 0; + if (flg < 0) + break; + /* cancel choosen task */ + if (flg > 0) { + if (TASK_ROOT(task)->root_hooks.hook_exec.cancel) + if (TASK_ROOT(task)->root_hooks.hook_exec.cancel(task, NULL)) { + flg = -1; + break; + } + /* custom hook */ + if (hook) + if (hook(task, NULL)) { + flg = -3; + break; + } - if (TASK_ROOT(task)->root_hooks.hook_exec.cancel) - if (TASK_ROOT(task)->root_hooks.hook_exec.cancel(task, NULL)) - return -1; - if (hook) - if (hook(task, NULL)) - return -3; + TAILQ_REMOVE(queue, task, task_node); + if (TASK_TYPE(task) != taskUNUSE) + _sched_unuseTask(task); + flg ^= flg; /* ok */ + } + } #ifdef HAVE_LIBPTHREAD - pthread_mutex_lock(&TASK_ROOT(task)->root_mtx[type]); + pthread_mutex_unlock(&root->root_mtx[type]); #endif - TAILQ_REMOVE(queue, task, task_node); -#ifdef HAVE_LIBPTHREAD - pthread_mutex_unlock(&TASK_ROOT(task)->root_mtx[type]); -#endif - - if (TASK_TYPE(task) != taskUNUSE) - _sched_unuseTask(task); - return 0; + return flg; } /*