--- libaitsched/src/hooks.c 2014/01/27 17:08:02 1.24.4.2 +++ libaitsched/src/hooks.c 2014/01/28 10:07:06 1.24.4.3 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: hooks.c,v 1.24.4.2 2014/01/27 17:08:02 misho Exp $ +* $Id: hooks.c,v 1.24.4.3 2014/01/28 10:07:06 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -750,8 +750,8 @@ sched_hook_fetch(void *root, void *arg __unused) /* kevent dispatcher */ now.tv_sec = now.tv_nsec = 0; /* Go and catch the cat into pipes ... */ - for (i = 0; i < en; i++) { #ifndef KQ_DISABLE + for (i = 0; i < en; i++) { memcpy(evt, &res[i], sizeof evt); evt->flags = EV_DELETE; /* Put read/write task to ready queue */ @@ -1120,9 +1120,118 @@ sched_hook_fetch(void *root, void *arg __unused) } else LOGERR; } + } #else /* end of kevent dispatcher */ -#endif /* KQ_DISABLE */ + for (i = 0; i < r->root_kq; i++) { + if (FD_ISSET(i, &r->root_fds[0])) { + flg = 0; + TAILQ_FOREACH_SAFE(task, &r->root_read, task_node, tmp) { + if (TASK_FD(task) != i) + continue; + else { + flg++; + TASK_RET(task) ^= TASK_RET(task); + TASK_FLAG(task) ^= TASK_FLAG(task); + } + /* remove read handle */ +#ifdef HAVE_LIBPTHREAD + pthread_mutex_lock(&r->root_mtx[taskREAD]); +#endif + TAILQ_REMOVE(&r->root_read, task, task_node); +#ifdef HAVE_LIBPTHREAD + pthread_mutex_unlock(&r->root_mtx[taskREAD]); +#endif + if (r->root_hooks.hook_exec.exception) { + if (r->root_hooks.hook_exec.exception(r, NULL)) { + task->task_type = taskUNUSE; +#ifdef HAVE_LIBPTHREAD + pthread_mutex_lock(&r->root_mtx[taskUNUSE]); +#endif + TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node); +#ifdef HAVE_LIBPTHREAD + pthread_mutex_unlock(&r->root_mtx[taskUNUSE]); +#endif + } else { + task->task_type = taskREADY; +#ifdef HAVE_LIBPTHREAD + pthread_mutex_lock(&r->root_mtx[taskREADY]); +#endif + TAILQ_INSERT_TAIL(&r->root_ready, task, task_node); +#ifdef HAVE_LIBPTHREAD + pthread_mutex_unlock(&r->root_mtx[taskREADY]); +#endif + } + } else { + task->task_type = taskREADY; +#ifdef HAVE_LIBPTHREAD + pthread_mutex_lock(&r->root_mtx[taskREADY]); +#endif + TAILQ_INSERT_TAIL(&r->root_ready, task, task_node); +#ifdef HAVE_LIBPTHREAD + pthread_mutex_unlock(&r->root_mtx[taskREADY]); +#endif + } + } + /* if match equal to 1, remove resouce */ + if (flg == 1) + FD_CLR(i, &r->root_fds[0]); + } + + if (FD_ISSET(i, &r->root_fds[1])) { + flg = 0; + TAILQ_FOREACH_SAFE(task, &r->root_write, task_node, tmp) { + if (TASK_FD(task) != i) + continue; + else { + flg++; + TASK_RET(task) ^= TASK_RET(task); + TASK_FLAG(task) ^= TASK_FLAG(task); + } + /* remove write handle */ +#ifdef HAVE_LIBPTHREAD + pthread_mutex_lock(&r->root_mtx[taskWRITE]); +#endif + TAILQ_REMOVE(&r->root_write, task, task_node); +#ifdef HAVE_LIBPTHREAD + pthread_mutex_unlock(&r->root_mtx[taskWRITE]); +#endif + if (r->root_hooks.hook_exec.exception) { + if (r->root_hooks.hook_exec.exception(r, NULL)) { + task->task_type = taskUNUSE; +#ifdef HAVE_LIBPTHREAD + pthread_mutex_lock(&r->root_mtx[taskUNUSE]); +#endif + TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node); +#ifdef HAVE_LIBPTHREAD + pthread_mutex_unlock(&r->root_mtx[taskUNUSE]); +#endif + } else { + task->task_type = taskREADY; +#ifdef HAVE_LIBPTHREAD + pthread_mutex_lock(&r->root_mtx[taskREADY]); +#endif + TAILQ_INSERT_TAIL(&r->root_ready, task, task_node); +#ifdef HAVE_LIBPTHREAD + pthread_mutex_unlock(&r->root_mtx[taskREADY]); +#endif + } + } else { + task->task_type = taskREADY; +#ifdef HAVE_LIBPTHREAD + pthread_mutex_lock(&r->root_mtx[taskREADY]); +#endif + TAILQ_INSERT_TAIL(&r->root_ready, task, task_node); +#ifdef HAVE_LIBPTHREAD + pthread_mutex_unlock(&r->root_mtx[taskREADY]); +#endif + } + } + /* if match equal to 1, remove resouce */ + if (flg == 1) + FD_CLR(i, &r->root_fds[1]); + } } +#endif /* KQ_DISABLE */ skip_event: /* timer update & put in ready queue */