|
|
| version 1.30.2.5, 2023/02/24 15:49:01 | version 1.30.2.6, 2023/02/25 15:46:15 |
|---|---|
| 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 394 schedEnd(sched_root_task_t ** __restrict root) | Line 400 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); | |
| #endif | #endif |
| e_free(*root); | e_free(*root); |
| Line 1126 _sched_sigDisp(void *arg) | Line 1135 _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 1163 _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 1180 schedSignalDispatch(sched_root_task_t * __restrict roo | Line 1199 schedSignalDispatch(sched_root_task_t * __restrict roo |
| #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); | |
| return 0; | return 0; |
| } | } |
| Line 1192 schedSignalDispatch(sched_root_task_t * __restrict roo | Line 1214 schedSignalDispatch(sched_root_task_t * __restrict roo |
| #endif | #endif |
| sigfillset(&ss); | sigfillset(&ss); |
| pthread_sigmask(SIG_BLOCK, &ss, NULL); | pthread_sigmask(SIG_BLOCK, &ss, &root->root_oldset); |
| 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; |
| } | } |