|
|
| version 1.16.2.1, 2013/05/26 20:14:02 | version 1.18.4.5, 2013/08/15 18:43:44 |
|---|---|
| Line 162 sched_hook_cancel(void *task, void *arg __unused) | Line 162 sched_hook_cancel(void *task, void *arg __unused) |
| #else | #else |
| EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, EV_DELETE, 0, 0, (void*) TASK_VAL(t)); | EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, EV_DELETE, 0, 0, (void*) TASK_VAL(t)); |
| #endif | #endif |
| /* restore signal */ | |
| signal(TASK_VAL(t), SIG_DFL); | |
| break; | break; |
| #ifdef AIO_SUPPORT | #ifdef AIO_SUPPORT |
| case taskAIO: | case taskAIO: |
| Line 211 sched_hook_cancel(void *task, void *arg __unused) | Line 213 sched_hook_cancel(void *task, void *arg __unused) |
| #ifdef HAVE_LIBPTHREAD | #ifdef HAVE_LIBPTHREAD |
| pthread_cancel((pthread_t) TASK_VAL(t)); | pthread_cancel((pthread_t) TASK_VAL(t)); |
| #endif | #endif |
| return NULL; | |
| case taskRTC: | |
| timer_delete((timer_t) TASK_FLAG(t)); | |
| schedCancel((sched_task_t*) TASK_RET(t)); | |
| return NULL; | |
| default: | default: |
| return NULL; | return NULL; |
| } | } |
| Line 339 sched_hook_alarm(void *task, void *arg __unused) | Line 346 sched_hook_alarm(void *task, void *arg __unused) |
| return (void*) -1; | return (void*) -1; |
| #ifdef __NetBSD__ | #ifdef __NetBSD__ |
| EV_SET(&chg[0], (uintptr_t) TASK_DATA(t), EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, | EV_SET(&chg[0], (uintptr_t) TASK_DATA(t), EVFILT_TIMER, EV_ADD | EV_CLEAR, 0, |
| t->task_val.ts.tv_sec * 1000 + t->task_val.ts.tv_nsec / 1000000, | t->task_val.ts.tv_sec * 1000 + t->task_val.ts.tv_nsec / 1000000, |
| (intptr_t) TASK_DATA(t)); | (intptr_t) TASK_DATA(t)); |
| #else | #else |
| EV_SET(&chg[0], (uintptr_t) TASK_DATA(t), EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, | EV_SET(&chg[0], (uintptr_t) TASK_DATA(t), EVFILT_TIMER, EV_ADD | EV_CLEAR, 0, |
| t->task_val.ts.tv_sec * 1000 + t->task_val.ts.tv_nsec / 1000000, | t->task_val.ts.tv_sec * 1000 + t->task_val.ts.tv_nsec / 1000000, |
| (void*) TASK_DATA(t)); | (void*) TASK_DATA(t)); |
| #endif | #endif |
| Line 447 sched_hook_signal(void *task, void *arg __unused) | Line 454 sched_hook_signal(void *task, void *arg __unused) |
| if (!t || !TASK_ROOT(t)) | if (!t || !TASK_ROOT(t)) |
| return (void*) -1; | return (void*) -1; |
| /* ignore signal */ | |
| signal(TASK_VAL(t), SIG_IGN); | |
| #ifdef __NetBSD__ | #ifdef __NetBSD__ |
| EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, EV_ADD, 0, 0, (intptr_t) TASK_VAL(t)); | EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, EV_ADD | EV_CLEAR, 0, 0, (intptr_t) TASK_VAL(t)); |
| #else | #else |
| EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, EV_ADD, 0, 0, (void*) TASK_VAL(t)); | EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, EV_ADD | EV_CLEAR, 0, 0, (void*) TASK_VAL(t)); |
| #endif | #endif |
| if (kevent(TASK_ROOT(t)->root_kq, chg, 1, NULL, 0, &timeout) == -1) { | if (kevent(TASK_ROOT(t)->root_kq, chg, 1, NULL, 0, &timeout) == -1) { |
| if (TASK_ROOT(t)->root_hooks.hook_exec.exception) | if (TASK_ROOT(t)->root_hooks.hook_exec.exception) |
| Line 635 sched_hook_fetch(void *root, void *arg __unused) | Line 645 sched_hook_fetch(void *root, void *arg __unused) |
| else { | else { |
| flg++; | flg++; |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove read handle */ | /* remove read handle */ |
| #ifdef HAVE_LIBPTHREAD | #ifdef HAVE_LIBPTHREAD |
| Line 688 sched_hook_fetch(void *root, void *arg __unused) | Line 698 sched_hook_fetch(void *root, void *arg __unused) |
| else { | else { |
| flg++; | flg++; |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove write handle */ | /* remove write handle */ |
| #ifdef HAVE_LIBPTHREAD | #ifdef HAVE_LIBPTHREAD |
| Line 741 sched_hook_fetch(void *root, void *arg __unused) | Line 751 sched_hook_fetch(void *root, void *arg __unused) |
| else { | else { |
| flg++; | flg++; |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove alarm handle */ | /* remove alarm handle */ |
| #ifdef HAVE_LIBPTHREAD | #ifdef HAVE_LIBPTHREAD |
| Line 772 sched_hook_fetch(void *root, void *arg __unused) | Line 782 sched_hook_fetch(void *root, void *arg __unused) |
| else { | else { |
| flg++; | flg++; |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove node handle */ | /* remove node handle */ |
| #ifdef HAVE_LIBPTHREAD | #ifdef HAVE_LIBPTHREAD |
| Line 803 sched_hook_fetch(void *root, void *arg __unused) | Line 813 sched_hook_fetch(void *root, void *arg __unused) |
| else { | else { |
| flg++; | flg++; |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove proc handle */ | /* remove proc handle */ |
| #ifdef HAVE_LIBPTHREAD | #ifdef HAVE_LIBPTHREAD |
| Line 834 sched_hook_fetch(void *root, void *arg __unused) | Line 844 sched_hook_fetch(void *root, void *arg __unused) |
| else { | else { |
| flg++; | flg++; |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove signal handle */ | /* remove signal handle */ |
| #ifdef HAVE_LIBPTHREAD | #ifdef HAVE_LIBPTHREAD |
| Line 867 sched_hook_fetch(void *root, void *arg __unused) | Line 877 sched_hook_fetch(void *root, void *arg __unused) |
| else { | else { |
| flg++; | flg++; |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove user handle */ | /* remove user handle */ |
| #ifdef HAVE_LIBPTHREAD | #ifdef HAVE_LIBPTHREAD |
| Line 909 sched_hook_fetch(void *root, void *arg __unused) | Line 919 sched_hook_fetch(void *root, void *arg __unused) |
| else { | else { |
| flg++; | flg++; |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove user handle */ | /* remove user handle */ |
| #ifdef HAVE_LIBPTHREAD | #ifdef HAVE_LIBPTHREAD |
| Line 959 sched_hook_fetch(void *root, void *arg __unused) | Line 969 sched_hook_fetch(void *root, void *arg __unused) |
| else { | else { |
| flg++; | flg++; |
| TASK_RET(task) = res[i].data; | TASK_RET(task) = res[i].data; |
| TASK_FLAG(task) = res[i].fflags; | TASK_FLAG(task) = (u_long) res[i].fflags; |
| } | } |
| /* remove user handle */ | /* remove user handle */ |
| #ifdef HAVE_LIBPTHREAD | #ifdef HAVE_LIBPTHREAD |
| Line 1111 sched_hook_condition(void *root, void *arg) | Line 1121 sched_hook_condition(void *root, void *arg) |
| return NULL; | return NULL; |
| return (void*) (r->root_cond - *(intptr_t*) arg); | return (void*) (r->root_cond - *(intptr_t*) arg); |
| } | |
| /* | |
| * sched_hook_rtc() - Default RTC hook | |
| * | |
| * @task = current task | |
| * @arg = unused | |
| * return: <0 errors and 0 ok | |
| */ | |
| void * | |
| sched_hook_rtc(void *task, void *arg __unused) | |
| { | |
| sched_task_t *sigt = NULL, *t = task; | |
| struct itimerspec its; | |
| struct sigevent evt; | |
| timer_t tmr; | |
| if (!t || !TASK_ROOT(t)) | |
| return (void*) -1; | |
| memset(&evt, 0, sizeof evt); | |
| evt.sigev_notify = SIGEV_SIGNAL; | |
| evt.sigev_signo = TASK_DATLEN(t) + SIGRTMIN; | |
| evt.sigev_value.sival_ptr = TASK_DATA(t); | |
| if (timer_create(CLOCK_MONOTONIC, &evt, &tmr) == -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; | |
| } else | |
| TASK_FLAG(t) = (u_long) tmr; | |
| if (!(sigt = schedSignal(TASK_ROOT(t), TASK_FUNC(t), TASK_ARG(t), evt.sigev_signo, | |
| TASK_DATA(t), (size_t) tmr))) { | |
| if (TASK_ROOT(t)->root_hooks.hook_exec.exception) | |
| TASK_ROOT(t)->root_hooks.hook_exec.exception(TASK_ROOT(t), NULL); | |
| else | |
| LOGERR; | |
| timer_delete(tmr); | |
| return (void*) -1; | |
| } else | |
| TASK_RET(t) = (uintptr_t) sigt; | |
| memset(&its, 0, sizeof its); | |
| its.it_value.tv_sec = t->task_val.ts.tv_sec; | |
| its.it_value.tv_nsec = t->task_val.ts.tv_nsec; | |
| if (timer_settime(tmr, TIMER_RELTIME, &its, 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; | |
| schedCancel(sigt); | |
| timer_delete(tmr); | |
| return (void*) -1; | |
| } | |
| return NULL; | |
| } | } |