--- libaitsched/src/aitsched.c 2011/10/04 14:17:32 1.2.2.3 +++ libaitsched/src/aitsched.c 2011/12/08 09:17:34 1.3.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsched.c,v 1.2.2.3 2011/10/04 14:17:32 misho Exp $ +* $Id: aitsched.c,v 1.3.2.1 2011/12/08 09:17:34 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -140,7 +140,8 @@ schedInit(void ** __restrict data, size_t datlen) if (datlen) { root->root_data.iov_base = *data; root->root_data.iov_len = datlen; - } else { + } else { /* if datlen == 0, switch to callbacks init mode */ + /* little hack :) for correct initialization of scheduler */ func = (int(*)(sched_root_task_t*)) data; func(root); } @@ -203,11 +204,19 @@ schedEnd(sched_root_task_t ** __restrict root) inline void * schedCall(sched_task_t * __restrict task) { + void *ptr = (void*) -1; + if (!task) - return (void*) -1; + return ptr; + if (!TASK_ISLOCKED(task)) + TASK_LOCK(task); + task->task_id++; - return task->task_func(task); + ptr = task->task_func(task); + + TASK_UNLOCK(task); + return ptr; } /* @@ -269,10 +278,8 @@ schedCancel(sched_task_t * __restrict task) } if (queue) TAILQ_REMOVE(queue, task, task_node); - if (task->task_type != taskUNUSE) { - task->task_type = taskUNUSE; - TAILQ_INSERT_TAIL(&task->task_root->root_unuse, task, task_node); - } + if (task->task_type != taskUNUSE) + _sched_unuseTask(task); return 0; } @@ -284,7 +291,7 @@ schedCancel(sched_task_t * __restrict task) * @criteria = find task by criteria [CRITERIA_CALL|CRITERIA_ARG|CRITERIA_FD|CRITERIA_VAL|CRITERIA_TV] * @param = search parameter * @hook = custom cleanup hook function, may be NULL - * return: -1 error or 0 ok + * return: -1 error, -2 error in sub-stage cancel execution, -3 error from custom hook or 0 ok */ int schedCancelby(sched_root_task_t * __restrict root, sched_queue_t * __restrict queue, @@ -323,7 +330,7 @@ schedCancelby(sched_root_task_t * __restrict root, sch break; } } else if (criteria == CRITERIA_FD) { - if (TASK_FD(task) == (int) param) { + if (TASK_FD(task) == (intptr_t) param) { flg++; break; } @@ -333,7 +340,7 @@ schedCancelby(sched_root_task_t * __restrict root, sch break; } } else if (criteria == CRITERIA_TV) { - if (&TASK_TV(task) == (struct timeval*) param) { + if (!timercmp(&TASK_TV(task), (struct timeval*) param, -)) { flg++; break; } @@ -353,10 +360,8 @@ schedCancelby(sched_root_task_t * __restrict root, sch TAILQ_REMOVE(queue, task, task_node); - if (task->task_type != taskUNUSE) { - task->task_type = taskUNUSE; - TAILQ_INSERT_TAIL(&task->task_root->root_unuse, task, task_node); - } + if (task->task_type != taskUNUSE) + _sched_unuseTask(task); return 0; }