|
|
| version 1.24.4.2, 2014/01/27 17:08:02 | version 1.24.4.5, 2014/01/28 10:37:19 |
|---|---|
| Line 529 sched_hook_proc(void *task, void *arg __unused) | Line 529 sched_hook_proc(void *task, void *arg __unused) |
| return NULL; | return NULL; |
| } | } |
| #ifdef KQ_DISABLE | |
| static void | |
| _sched_sigHandler(int sig) | |
| { | |
| } | |
| #endif /* KQ_DISABLE */ | |
| /* | /* |
| * sched_hook_signal() - Default SIGNAL hook | * sched_hook_signal() - Default SIGNAL hook |
| * | * |
| Line 539 sched_hook_proc(void *task, void *arg __unused) | Line 546 sched_hook_proc(void *task, void *arg __unused) |
| void * | void * |
| sched_hook_signal(void *task, void *arg __unused) | sched_hook_signal(void *task, void *arg __unused) |
| { | { |
| #ifndef KQ_DISABLE | |
| sched_task_t *t = task; | sched_task_t *t = task; |
| #ifndef KQ_DISABLE | |
| struct kevent chg[1]; | struct kevent chg[1]; |
| struct timespec timeout = { 0, 0 }; | struct timespec timeout = { 0, 0 }; |
| Line 562 sched_hook_signal(void *task, void *arg __unused) | Line 569 sched_hook_signal(void *task, void *arg __unused) |
| LOGERR; | LOGERR; |
| return (void*) -1; | return (void*) -1; |
| } | } |
| #else | |
| struct sigaction sa; | |
| memset(&sa, 0, sizeof sa); | |
| sigemptyset(&sa.sa_mask); | |
| sa.sa_handler = _sched_sigHandler; | |
| sa.sa_flags = SA_RESETHAND | SA_RESTART; | |
| if (sigaction(TASK_VAL(t), &sa, NULL) == -1) { | |
| if (TASK_ROOT(t)->root_hooks.hook_exec.exception) | |
| TASK_ROOT(t)->root_hooks.hook_exec.exception(TASK_ROOT(t), NULL); | |
| else | |
| LOGERR; | |
| return (void*) -1; | |
| } | |
| #endif | #endif |
| return NULL; | return NULL; |
| } | } |
| Line 750 sched_hook_fetch(void *root, void *arg __unused) | Line 771 sched_hook_fetch(void *root, void *arg __unused) |
| /* kevent dispatcher */ | /* kevent dispatcher */ |
| now.tv_sec = now.tv_nsec = 0; | now.tv_sec = now.tv_nsec = 0; |
| /* Go and catch the cat into pipes ... */ | /* Go and catch the cat into pipes ... */ |
| for (i = 0; i < en; i++) { | |
| #ifndef KQ_DISABLE | #ifndef KQ_DISABLE |
| for (i = 0; i < en; i++) { | |
| memcpy(evt, &res[i], sizeof evt); | memcpy(evt, &res[i], sizeof evt); |
| evt->flags = EV_DELETE; | evt->flags = EV_DELETE; |
| /* Put read/write task to ready queue */ | /* Put read/write task to ready queue */ |
| Line 1120 sched_hook_fetch(void *root, void *arg __unused) | Line 1141 sched_hook_fetch(void *root, void *arg __unused) |
| } else | } else |
| LOGERR; | LOGERR; |
| } | } |
| } | |
| #else /* end of kevent dispatcher */ | #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]); | |
| } | |
| } | } |
| /* optimize select */ | |
| for (i = r->root_kq - 1; i > 2; i--) | |
| if (FD_ISSET(i, &r->root_fds[0]) || FD_ISSET(i, &r->root_fds[1])) | |
| break; | |
| if (i > 2) | |
| r->root_kq = i + 1; | |
| #endif /* KQ_DISABLE */ | |
| skip_event: | skip_event: |
| /* timer update & put in ready queue */ | /* timer update & put in ready queue */ |