|
|
| version 1.30.2.4, 2023/02/23 17:13:01 | version 1.34.2.1, 2023/08/31 15:25:59 |
|---|---|
| Line 181 schedRegisterHooks(sched_root_task_t * __restrict root | Line 181 schedRegisterHooks(sched_root_task_t * __restrict root |
| root->root_hooks.hook_add.alarm = sched_hook_alarm; | root->root_hooks.hook_add.alarm = sched_hook_alarm; |
| root->root_hooks.hook_add.node = sched_hook_node; | root->root_hooks.hook_add.node = sched_hook_node; |
| root->root_hooks.hook_add.proc = sched_hook_proc; | root->root_hooks.hook_add.proc = sched_hook_proc; |
| root->root_hooks.hook_add.signal = sched_hook_signal; | |
| #ifdef EVFILT_USER | #ifdef EVFILT_USER |
| root->root_hooks.hook_add.user = sched_hook_user; | root->root_hooks.hook_add.user = sched_hook_user; |
| #endif | #endif |
| Line 189 schedRegisterHooks(sched_root_task_t * __restrict root | Line 188 schedRegisterHooks(sched_root_task_t * __restrict root |
| #ifdef HAVE_LIBPTHREAD | #ifdef HAVE_LIBPTHREAD |
| root->root_hooks.hook_add.thread = sched_hook_thread; | root->root_hooks.hook_add.thread = sched_hook_thread; |
| #endif | #endif |
| root->root_hooks.hook_add.signal = sched_hook_signal; | |
| root->root_hooks.hook_exec.cancel = sched_hook_cancel; | root->root_hooks.hook_exec.cancel = sched_hook_cancel; |
| root->root_hooks.hook_exec.fetch = sched_hook_fetch; | root->root_hooks.hook_exec.fetch = sched_hook_fetch; |
| Line 228 schedInit(void ** __restrict data, size_t datlen) | Line 228 schedInit(void ** __restrict data, size_t datlen) |
| sched_timespecinf(&root->root_poll); | sched_timespecinf(&root->root_poll); |
| #ifdef HAVE_LIBPTHREAD | #ifdef HAVE_LIBPTHREAD |
| if (pthread_mutex_init(&root->root_sigmtx, NULL)) { | |
| LOGERR; | |
| e_free(root); | |
| return NULL; | |
| } | |
| for (i = 0; i < taskMAX; i++) | for (i = 0; i < taskMAX; i++) |
| if ((errno = pthread_mutex_init(&root->root_mtx[i], NULL))) { | if ((errno = pthread_mutex_init(&root->root_mtx[i], NULL))) { |
| LOGERR; | LOGERR; |
| Line 262 schedInit(void ** __restrict data, size_t datlen) | Line 268 schedInit(void ** __restrict data, size_t datlen) |
| #ifdef HAVE_LIBPTHREAD | #ifdef HAVE_LIBPTHREAD |
| for (i = 0; i < taskMAX; i++) | for (i = 0; i < taskMAX; i++) |
| pthread_mutex_unlock(&root->root_mtx[i]); | pthread_mutex_unlock(&root->root_mtx[i]); |
| pthread_sigmask(SIG_BLOCK, NULL, &root->root_oldset); | |
| #else | |
| sigprocmask(SIG_BLOCK, NULL, &root->root_oldset); | |
| #endif | #endif |
| if (data && *data) { | if (data && *data) { |
| Line 394 schedEnd(sched_root_task_t ** __restrict root) | Line 404 schedEnd(sched_root_task_t ** __restrict root) |
| #else | #else |
| (*root)->root_sigthr = NULL; | (*root)->root_sigthr = NULL; |
| #endif | #endif |
| pthread_sigmask(SIG_SETMASK, &(*root)->root_oldset, NULL); | |
| pthread_mutex_unlock(&(*root)->root_sigmtx); | |
| } | } |
| pthread_mutex_destroy(&(*root)->root_sigmtx); | |
| #else | |
| sigprocmask(SIG_SETMASK, &(*root)->root_oldset, NULL); | |
| #endif | #endif |
| e_free(*root); | e_free(*root); |
| Line 1126 _sched_sigDisp(void *arg) | Line 1141 _sched_sigDisp(void *arg) |
| sched_root_task_t *root = arg; | sched_root_task_t *root = arg; |
| sched_task_t *task, *tmp; | sched_task_t *task, *tmp; |
| int sig, flg; | int sig, flg; |
| sigset_t ss; | |
| sigfillset(&ss); | |
| while (root->root_sigthr) { | while (root->root_sigthr) { |
| if (sigwait(&root->root_sigset, &sig)) | if (sigwait(&ss, &sig)) |
| continue; | continue; |
| pthread_mutex_lock(&root->root_sigmtx); | |
| if (!sigismember(&root->root_sigset, sig)) { | |
| pthread_mutex_unlock(&root->root_sigmtx); | |
| continue; | |
| } | |
| flg = 0; | flg = 0; |
| TAILQ_FOREACH_SAFE(task, &root->root_signal, task_node, tmp) { | TAILQ_FOREACH_SAFE(task, &root->root_signal, task_node, tmp) { |
| if (TASK_VAL(task) == (uintptr_t) sig) { | if (TASK_VAL(task) == (uintptr_t) sig) { |
| Line 1146 _sched_sigDisp(void *arg) | Line 1169 _sched_sigDisp(void *arg) |
| } | } |
| if (flg < 2) | if (flg < 2) |
| sigdelset(&root->root_sigset, sig); | sigdelset(&root->root_sigset, sig); |
| pthread_mutex_unlock(&root->root_sigmtx); | |
| } | } |
| return NULL; | return NULL; |
| Line 1162 int | Line 1187 int |
| schedSignalDispatch(sched_root_task_t * __restrict root, int on) | schedSignalDispatch(sched_root_task_t * __restrict root, int on) |
| { | { |
| sigset_t ss; | sigset_t ss; |
| struct timespec ts = { .tv_sec = 1, .tv_nsec = 0 }; | |
| #ifndef HAVE_LIBPTHREAD | #ifndef HAVE_LIBPTHREAD |
| sched_SetErr(ENOTSUP, "Library has not support pthreads"); | sched_SetErr(ENOTSUP, "Library has not support pthreads"); |
| return -1; | return -1; |
| Line 1169 schedSignalDispatch(sched_root_task_t * __restrict roo | Line 1195 schedSignalDispatch(sched_root_task_t * __restrict roo |
| pthread_attr_t attr; | pthread_attr_t attr; |
| #endif | #endif |
| #if SUP_ENABLE == KQ_SUPPORT | |
| return 0; | |
| #endif | |
| if (!on) { | if (!on) { |
| pthread_cancel(root->root_sigthr); | pthread_cancel(root->root_sigthr); |
| #ifdef __linux__ | #ifdef __linux__ |
| Line 1179 schedSignalDispatch(sched_root_task_t * __restrict roo | Line 1209 schedSignalDispatch(sched_root_task_t * __restrict roo |
| return 0; | return 0; |
| } | } |
| /* if we have not using polling, then we must turn on */ | |
| if (sched_timespecisinf(&root->root_poll)) | |
| schedPolling(root, &ts, NULL); | |
| pthread_attr_init(&attr); | pthread_attr_init(&attr); |
| pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); | pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); |
| #ifdef SCHED_RR | #ifdef SCHED_RR |
| Line 1189 schedSignalDispatch(sched_root_task_t * __restrict roo | Line 1223 schedSignalDispatch(sched_root_task_t * __restrict roo |
| sigfillset(&ss); | sigfillset(&ss); |
| pthread_sigmask(SIG_BLOCK, &ss, NULL); | pthread_sigmask(SIG_BLOCK, &ss, NULL); |
| if (pthread_create(&root->root_sigthr, &attr, _sched_sigDisp, root)) { | if (pthread_create(&root->root_sigthr, &attr, _sched_sigDisp, root)) { |
| sched_SetErr(errno, "pthread_create(SignalDispatch) #%d - %s", | sched_SetErr(errno, "pthread_create(SignalDispatch) #%d - %s", |
| errno, strerror(errno)); | errno, strerror(errno)); |
| #ifdef __linux__ | |
| root->root_sigthr = 0L; | |
| #else | |
| root->root_sigthr = NULL; | |
| #endif | |
| pthread_sigmask(SIG_SETMASK, &root->root_oldset, NULL); | |
| return -1; | return -1; |
| } | } |