|
|
| version 1.27.2.8, 2014/06/05 22:16:00 | version 1.27.2.10, 2014/06/05 22:23:50 |
|---|---|
| Line 859 static inline void | Line 859 static inline void |
| fetch_hook_kevent_proceed(int en, struct kevent *res, sched_root_task_t *r) | fetch_hook_kevent_proceed(int en, struct kevent *res, sched_root_task_t *r) |
| { | { |
| struct kevent evt[1]; | struct kevent evt[1]; |
| register int i, flg; | register int i; |
| sched_task_t *task, *tmp; | sched_task_t *task, *tmp; |
| struct timespec now = { 0, 0 }; | struct timespec now = { 0, 0 }; |
| #ifdef AIO_SUPPORT | #ifdef AIO_SUPPORT |
| Line 880 fetch_hook_kevent_proceed(int en, struct kevent *res, | Line 880 fetch_hook_kevent_proceed(int en, struct kevent *res, |
| /* Put read/write task to ready queue */ | /* Put read/write task to ready queue */ |
| switch (res[i].filter) { | switch (res[i].filter) { |
| case EVFILT_READ: | case EVFILT_READ: |
| flg = 0; | |
| TAILQ_FOREACH_SAFE(task, &r->root_read, task_node, tmp) { | TAILQ_FOREACH_SAFE(task, &r->root_read, task_node, tmp) { |
| if (TASK_FD(task) != ((intptr_t) res[i].udata)) | if (TASK_FD(task) != ((intptr_t) res[i].udata)) |
| continue; | continue; |
| else { | else { |
| flg++; | |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = (u_long) res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| Line 905 fetch_hook_kevent_proceed(int en, struct kevent *res, | Line 903 fetch_hook_kevent_proceed(int en, struct kevent *res, |
| insert_task_to(task, &r->root_ready); | insert_task_to(task, &r->root_ready); |
| } | } |
| } | } |
| /* if match at least 2, don't remove resouce of event */ | |
| if (flg > 1) | |
| evt->flags ^= evt->flags; | |
| break; | break; |
| case EVFILT_WRITE: | case EVFILT_WRITE: |
| flg = 0; | |
| TAILQ_FOREACH_SAFE(task, &r->root_write, task_node, tmp) { | TAILQ_FOREACH_SAFE(task, &r->root_write, task_node, tmp) { |
| if (TASK_FD(task) != ((intptr_t) res[i].udata)) | if (TASK_FD(task) != ((intptr_t) res[i].udata)) |
| continue; | continue; |
| else { | else { |
| flg++; | |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = (u_long) res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| Line 935 fetch_hook_kevent_proceed(int en, struct kevent *res, | Line 928 fetch_hook_kevent_proceed(int en, struct kevent *res, |
| insert_task_to(task, &r->root_ready); | insert_task_to(task, &r->root_ready); |
| } | } |
| } | } |
| /* if match at least 2, don't remove resouce of event */ | |
| if (flg > 1) | |
| evt->flags ^= evt->flags; | |
| break; | break; |
| case EVFILT_TIMER: | case EVFILT_TIMER: |
| flg = 0; | |
| TAILQ_FOREACH_SAFE(task, &r->root_alarm, task_node, tmp) { | TAILQ_FOREACH_SAFE(task, &r->root_alarm, task_node, tmp) { |
| if ((uintptr_t) TASK_DATA(task) != ((uintptr_t) res[i].udata)) | if ((uintptr_t) TASK_DATA(task) != ((uintptr_t) res[i].udata)) |
| continue; | continue; |
| else { | else { |
| flg++; | |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = (u_long) res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove alarm handle */ | /* remove alarm handle */ |
| transit_task2ready(task, &r->root_alarm); | transit_task2ready(task, &r->root_alarm); |
| } | } |
| /* if match at least 2, don't remove resouce of event */ | |
| if (flg > 1) | |
| evt->flags ^= evt->flags; | |
| break; | break; |
| case EVFILT_VNODE: | case EVFILT_VNODE: |
| flg = 0; | |
| TAILQ_FOREACH_SAFE(task, &r->root_node, task_node, tmp) { | TAILQ_FOREACH_SAFE(task, &r->root_node, task_node, tmp) { |
| if (TASK_FD(task) != ((intptr_t) res[i].udata)) | if (TASK_FD(task) != ((intptr_t) res[i].udata)) |
| continue; | continue; |
| else { | else { |
| flg++; | |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = (u_long) res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove node handle */ | /* remove node handle */ |
| transit_task2ready(task, &r->root_node); | transit_task2ready(task, &r->root_node); |
| } | } |
| /* if match at least 2, don't remove resouce of event */ | |
| if (flg > 1) | |
| evt->flags ^= evt->flags; | |
| break; | break; |
| case EVFILT_PROC: | case EVFILT_PROC: |
| flg = 0; | |
| TAILQ_FOREACH_SAFE(task, &r->root_proc, task_node, tmp) { | TAILQ_FOREACH_SAFE(task, &r->root_proc, task_node, tmp) { |
| if (TASK_VAL(task) != ((uintptr_t) res[i].udata)) | if (TASK_VAL(task) != ((uintptr_t) res[i].udata)) |
| continue; | continue; |
| else { | else { |
| flg++; | |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = (u_long) res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove proc handle */ | /* remove proc handle */ |
| transit_task2ready(task, &r->root_proc); | transit_task2ready(task, &r->root_proc); |
| } | } |
| /* if match at least 2, don't remove resouce of event */ | |
| if (flg > 1) | |
| evt->flags ^= evt->flags; | |
| break; | break; |
| case EVFILT_SIGNAL: | case EVFILT_SIGNAL: |
| flg = 0; | |
| TAILQ_FOREACH_SAFE(task, &r->root_signal, task_node, tmp) { | TAILQ_FOREACH_SAFE(task, &r->root_signal, task_node, tmp) { |
| if (TASK_VAL(task) != ((uintptr_t) res[i].udata)) | if (TASK_VAL(task) != ((uintptr_t) res[i].udata)) |
| continue; | continue; |
| else { | else { |
| flg++; | |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = (u_long) res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove signal handle */ | /* remove signal handle */ |
| transit_task2ready(task, &r->root_signal); | transit_task2ready(task, &r->root_signal); |
| } | } |
| /* if match at least 2, don't remove resouce of event */ | |
| if (flg > 1) | |
| evt->flags ^= evt->flags; | |
| break; | break; |
| #ifdef AIO_SUPPORT | #ifdef AIO_SUPPORT |
| case EVFILT_AIO: | case EVFILT_AIO: |
| flg = 0; | |
| TAILQ_FOREACH_SAFE(task, &r->root_aio, task_node, tmp) { | TAILQ_FOREACH_SAFE(task, &r->root_aio, task_node, tmp) { |
| acb = (struct aiocb*) TASK_VAL(task); | acb = (struct aiocb*) TASK_VAL(task); |
| if (acb != ((struct aiocb*) res[i].udata)) | if (acb != ((struct aiocb*) res[i].udata)) |
| continue; | continue; |
| else { | else { |
| flg++; | |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = (u_long) res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| Line 1032 fetch_hook_kevent_proceed(int en, struct kevent *res, | Line 1000 fetch_hook_kevent_proceed(int en, struct kevent *res, |
| TASK_DATLEN(task) = (u_long) len; | TASK_DATLEN(task) = (u_long) len; |
| TASK_FD(task) = fd; | TASK_FD(task) = fd; |
| } | } |
| /* if match at least 2, don't remove resouce of event */ | |
| if (flg > 1) | |
| evt->flags ^= evt->flags; | |
| break; | break; |
| #ifdef EVFILT_LIO | #ifdef EVFILT_LIO |
| case EVFILT_LIO: | case EVFILT_LIO: |
| flg = 0; | |
| TAILQ_FOREACH_SAFE(task, &r->root_lio, task_node, tmp) { | TAILQ_FOREACH_SAFE(task, &r->root_lio, task_node, tmp) { |
| acbs = (struct aiocb**) TASK_VAL(task); | acbs = (struct aiocb**) TASK_VAL(task); |
| if (acbs != ((struct aiocb**) res[i].udata)) | if (acbs != ((struct aiocb**) res[i].udata)) |
| continue; | continue; |
| else { | else { |
| flg++; | |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = (u_long) res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| Line 1068 fetch_hook_kevent_proceed(int en, struct kevent *res, | Line 1031 fetch_hook_kevent_proceed(int en, struct kevent *res, |
| if (lseek(fd, off + len, SEEK_CUR) == -1) | if (lseek(fd, off + len, SEEK_CUR) == -1) |
| LOGERR; | LOGERR; |
| } | } |
| /* if match at least 2, don't remove resouce of event */ | |
| if (flg > 1) | |
| evt->flags ^= evt->flags; | |
| break; | break; |
| #endif /* EVFILT_LIO */ | #endif /* EVFILT_LIO */ |
| #endif /* AIO_SUPPORT */ | #endif /* AIO_SUPPORT */ |
| #ifdef EVFILT_USER | #ifdef EVFILT_USER |
| case EVFILT_USER: | case EVFILT_USER: |
| flg = 0; | |
| TAILQ_FOREACH_SAFE(task, &r->root_user, task_node, tmp) { | TAILQ_FOREACH_SAFE(task, &r->root_user, task_node, tmp) { |
| if (TASK_VAL(task) != ((uintptr_t) res[i].udata)) | if (TASK_VAL(task) != ((uintptr_t) res[i].udata)) |
| continue; | continue; |
| else { | else { |
| flg++; | |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = (u_long) res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove user handle */ | /* remove user handle */ |
| transit_task2ready(task, &r->root_user); | transit_task2ready(task, &r->root_user); |
| } | } |
| /* if match at least 2, don't remove resouce of event */ | |
| if (flg > 1) | |
| evt->flags ^= evt->flags; | |
| break; | break; |
| #endif /* EVFILT_USER */ | #endif /* EVFILT_USER */ |
| } | } |
| Line 1240 fetch_hook_select_proceed(int en, fd_set rfd, fd_set w | Line 1195 fetch_hook_select_proceed(int en, fd_set rfd, fd_set w |
| insert_task_to(task, &r->root_ready); | insert_task_to(task, &r->root_ready); |
| } | } |
| } | } |
| /* if match equal to 1, remove resouce */ | /* remove resouce */ |
| if (flg == 1) | if (flg) |
| FD_CLR(i, &r->root_fds[0]); | FD_CLR(i, &r->root_fds[0]); |
| } | } |
| Line 1271 fetch_hook_select_proceed(int en, fd_set rfd, fd_set w | Line 1226 fetch_hook_select_proceed(int en, fd_set rfd, fd_set w |
| insert_task_to(task, &r->root_ready); | insert_task_to(task, &r->root_ready); |
| } | } |
| } | } |
| /* if match equal to 1, remove resouce */ | /* remove resouce */ |
| if (flg == 1) | if (flg) |
| FD_CLR(i, &r->root_fds[1]); | FD_CLR(i, &r->root_fds[1]); |
| } | } |
| } | } |