|
|
| version 1.1.1.1.2.3, 2011/08/11 13:23:28 | version 1.2.2.1, 2011/10/04 13:29:00 |
|---|---|
| Line 128 sched_hook_cancel(void *task, void *arg __unused) | Line 128 sched_hook_cancel(void *task, void *arg __unused) |
| switch (t->task_type) { | switch (t->task_type) { |
| case taskREAD: | case taskREAD: |
| if (FD_ISSET(TASK_FD(t), &io->wfd)) | |
| #ifdef __NetBSD__ | #ifdef __NetBSD__ |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, (intptr_t) &TASK_FD(t)); | EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_DELETE, 0, 0, (intptr_t) TASK_FD(t)); |
| #else | #else |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, &TASK_FD(t)); | EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_DELETE, 0, 0, (void*) TASK_FD(t)); |
| #endif | #endif |
| else | |
| #ifdef __NetBSD__ | |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_DELETE, 0, 0, (intptr_t) &TASK_FD(t)); | |
| #else | |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_DELETE, 0, 0, &TASK_FD(t)); | |
| #endif | |
| kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout); | kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout); |
| FD_CLR(TASK_FD(t), &io->rfd); | FD_CLR(TASK_FD(t), &io->rfd); |
| break; | break; |
| case taskWRITE: | case taskWRITE: |
| if (FD_ISSET(TASK_FD(t), &io->rfd)) | |
| #ifdef __NetBSD__ | #ifdef __NetBSD__ |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, (intptr_t) &TASK_FD(t)); | EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_DELETE, 0, 0, (intptr_t) TASK_FD(t)); |
| #else | #else |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, &TASK_FD(t)); | EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_DELETE, 0, 0, (void*) TASK_FD(t)); |
| #endif | #endif |
| else | |
| #ifdef __NetBSD__ | |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_DELETE, 0, 0, (intptr_t) &TASK_FD(t)); | |
| #else | |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_DELETE, 0, 0, &TASK_FD(t)); | |
| #endif | |
| kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout); | kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout); |
| FD_CLR(TASK_FD(t), &io->wfd); | FD_CLR(TASK_FD(t), &io->wfd); |
| break; | break; |
| default: | default: |
| Line 193 sched_hook_read(void *task, void *arg __unused) | Line 177 sched_hook_read(void *task, void *arg __unused) |
| FD_SET(TASK_FD(t), &io->rfd); | FD_SET(TASK_FD(t), &io->rfd); |
| #ifdef __NetBSD__ | #ifdef __NetBSD__ |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, (intptr_t) &TASK_FD(t)); | EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, (intptr_t) TASK_FD(t)); |
| #else | #else |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, &TASK_FD(t)); | EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, (void*) TASK_FD(t)); |
| #endif | #endif |
| if (kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout) == -1) { | if (kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout) == -1) { |
| LOGERR; | if (t->task_root->root_hooks.hook_exec.exception) |
| t->task_root->root_hooks.hook_exec.exception(t->task_root, NULL); | |
| return (void*) -1; | return (void*) -1; |
| } | } |
| Line 230 sched_hook_write(void *task, void *arg __unused) | Line 215 sched_hook_write(void *task, void *arg __unused) |
| FD_SET(TASK_FD(t), &io->wfd); | FD_SET(TASK_FD(t), &io->wfd); |
| #ifdef __NetBSD__ | #ifdef __NetBSD__ |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, (intptr_t) &TASK_FD(t)); | EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, (intptr_t) TASK_FD(t)); |
| #else | #else |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, &TASK_FD(t)); | EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, (void*) TASK_FD(t)); |
| #endif | #endif |
| if (kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout) == -1) { | if (kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout) == -1) { |
| LOGERR; | if (t->task_root->root_hooks.hook_exec.exception) |
| t->task_root->root_hooks.hook_exec.exception(t->task_root, NULL); | |
| return (void*) -1; | return (void*) -1; |
| } | } |
| Line 324 retry: | Line 310 retry: |
| } else /* wait INFTIM */ | } else /* wait INFTIM */ |
| timeout = NULL; | timeout = NULL; |
| if ((en = kevent(r->root_kq, NULL, 0, res, KQ_EVENTS, timeout)) == -1) { | if ((en = kevent(r->root_kq, NULL, 0, res, KQ_EVENTS, timeout)) == -1) { |
| LOGERR; | if (r->root_hooks.hook_exec.exception) |
| if (r->root_hooks.hook_exec.exception(r, NULL)) | |
| return NULL; /* exit from scheduler */ | |
| #ifdef NDEBUG | |
| /* kevent no exit by error, if non-debug version */ | |
| goto retry; | goto retry; |
| #else | |
| /* diagnostic exit from scheduler if kevent error occur */ | |
| return NULL; | |
| #endif | |
| } | } |
| nw.tv_sec = nw.tv_nsec = 0; | nw.tv_sec = nw.tv_nsec = 0; |
| Line 337 retry: | Line 331 retry: |
| switch (res[i].filter) { | switch (res[i].filter) { |
| case EVFILT_READ: | case EVFILT_READ: |
| TAILQ_FOREACH(task, &r->root_read, task_node) { | TAILQ_FOREACH(task, &r->root_read, task_node) { |
| if (TASK_FD(task) != *((int*) res[i].udata)) | if (TASK_FD(task) != ((int) res[i].udata)) |
| continue; | continue; |
| /* remove read handle */ | /* remove read handle */ |
| io = ROOT_DATA(task->task_root); | io = ROOT_DATA(task->task_root); |
| FD_CLR(TASK_FD(task), &io->rfd); | FD_CLR(TASK_FD(task), &io->rfd); |
| TAILQ_REMOVE(&r->root_read, task, task_node); | TAILQ_REMOVE(&r->root_read, task, task_node); |
| task->task_type = taskREADY; | if (r->root_hooks.hook_exec.exception && res[i].flags & EV_EOF) { |
| TAILQ_INSERT_TAIL(&r->root_ready, task, task_node); | if (r->root_hooks.hook_exec.exception(r, (void*) EV_EOF)) { |
| task->task_type = taskUNUSE; | |
| TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node); | |
| } else { | |
| task->task_type = taskREADY; | |
| TAILQ_INSERT_TAIL(&r->root_ready, task, task_node); | |
| } | |
| } else { | |
| task->task_type = taskREADY; | |
| TAILQ_INSERT_TAIL(&r->root_ready, task, task_node); | |
| } | |
| break; | break; |
| } | } |
| break; | break; |
| case EVFILT_WRITE: | case EVFILT_WRITE: |
| TAILQ_FOREACH(task, &r->root_write, task_node) { | TAILQ_FOREACH(task, &r->root_write, task_node) { |
| if (TASK_FD(task) != *((int*) res[i].udata)) | if (TASK_FD(task) != ((int) res[i].udata)) |
| continue; | continue; |
| /* remove write handle */ | /* remove write handle */ |
| io = ROOT_DATA(task->task_root); | io = ROOT_DATA(task->task_root); |
| FD_CLR(TASK_FD(task), &io->wfd); | FD_CLR(TASK_FD(task), &io->wfd); |
| TAILQ_REMOVE(&r->root_write, task, task_node); | TAILQ_REMOVE(&r->root_write, task, task_node); |
| task->task_type = taskREADY; | if (r->root_hooks.hook_exec.exception && res[i].flags & EV_EOF) { |
| TAILQ_INSERT_TAIL(&r->root_ready, task, task_node); | if (r->root_hooks.hook_exec.exception(r, (void*) EV_EOF)) { |
| task->task_type = taskUNUSE; | |
| TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node); | |
| } else { | |
| task->task_type = taskREADY; | |
| TAILQ_INSERT_TAIL(&r->root_ready, task, task_node); | |
| } | |
| } else { | |
| task->task_type = taskREADY; | |
| TAILQ_INSERT_TAIL(&r->root_ready, task, task_node); | |
| } | |
| break; | break; |
| } | } |
| break; | break; |
| } | } |
| if (kevent(r->root_kq, evt, 1, NULL, 0, &nw) == -1) | if (kevent(r->root_kq, evt, 1, NULL, 0, &nw) == -1) |
| LOGERR; | if (r->root_hooks.hook_exec.exception) |
| if (r->root_hooks.hook_exec.exception(r, NULL)) | |
| return NULL; /* exit from scheduler */ | |
| } | } |
| /* timer update */ | /* timer update & put in ready queue */ |
| clock_gettime(CLOCK_MONOTONIC, &nw); | clock_gettime(CLOCK_MONOTONIC, &nw); |
| now.tv_sec = nw.tv_sec; | now.tv_sec = nw.tv_sec; |
| now.tv_usec = nw.tv_nsec / 1000; | now.tv_usec = nw.tv_nsec / 1000; |
| Line 404 retry: | Line 419 retry: |
| return task; | return task; |
| } | } |
| /* | |
| * sched_hook_exception() - Default EXCEPTION hook | |
| * @root = root task | |
| * @arg = may be EV_EOF | |
| * return: <0 errors and 0 ok | |
| */ | |
| void * | |
| sched_hook_exception(void *root, void *arg) | |
| { | |
| sched_root_task_t *r = root; | |
| if (!r || !ROOT_DATA(r) || !ROOT_DATLEN(r)) | |
| return NULL; | |
| if (arg) { | |
| if (arg == (void*) EV_EOF) | |
| return NULL; | |
| return (void*) -1; /* raise error */ | |
| } else | |
| LOGERR; | |
| if (errno == EINTR) | |
| return (void*) -1; /* raise error */ | |
| return NULL; | |
| } |