|
|
| version 1.1.1.1.2.8, 2011/09/30 08:13:41 | version 1.2.2.1, 2011/10/04 13:29:00 |
|---|---|
| Line 182 sched_hook_read(void *task, void *arg __unused) | Line 182 sched_hook_read(void *task, void *arg __unused) |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, (void*) 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 219 sched_hook_write(void *task, void *arg __unused) | Line 220 sched_hook_write(void *task, void *arg __unused) |
| EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, (void*) 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 308 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 | #ifdef NDEBUG |
| /* kevent no exit by error, if non-debug version */ | /* kevent no exit by error, if non-debug version */ |
| goto retry; | goto retry; |
| Line 334 retry: | Line 338 retry: |
| 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); |
| /* if (res[i].flags & EV_EOF) { | if (r->root_hooks.hook_exec.exception && res[i].flags & EV_EOF) { |
| task->task_type = taskUNUSE; | if (r->root_hooks.hook_exec.exception(r, (void*) EV_EOF)) { |
| TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node); | task->task_type = taskUNUSE; |
| } else { */ | 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; | task->task_type = taskREADY; |
| TAILQ_INSERT_TAIL(&r->root_ready, task, task_node); | TAILQ_INSERT_TAIL(&r->root_ready, task, task_node); |
| /* } */ | } |
| break; | break; |
| } | } |
| break; | break; |
| Line 353 retry: | Line 362 retry: |
| 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); |
| /* if (res[i].flags & EV_EOF) { | if (r->root_hooks.hook_exec.exception && res[i].flags & EV_EOF) { |
| task->task_type = taskUNUSE; | if (r->root_hooks.hook_exec.exception(r, (void*) EV_EOF)) { |
| TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node); | task->task_type = taskUNUSE; |
| } else { */ | 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; | task->task_type = taskREADY; |
| TAILQ_INSERT_TAIL(&r->root_ready, task, task_node); | 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 & put in ready queue */ | /* timer update & put in ready queue */ |
| Line 401 retry: | Line 417 retry: |
| task->task_type = taskUNUSE; | task->task_type = taskUNUSE; |
| TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node); | TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node); |
| 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; | |
| } | } |