| 
 |   
| version 1.30, 2023/01/18 23:46:18 | 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 386 schedEnd(sched_root_task_t ** __restrict root) | Line 392 schedEnd(sched_root_task_t ** __restrict root) | 
| SCHED_QUNLOCK(*root, i); | SCHED_QUNLOCK(*root, i); | 
| pthread_mutex_destroy(&(*root)->root_mtx[i]); | pthread_mutex_destroy(&(*root)->root_mtx[i]); | 
| } | } | 
| if ((*root)->root_sigthr) { | |
| pthread_cancel((*root)->root_sigthr); | |
| #ifdef __linux__ | |
| (*root)->root_sigthr = 0L; | |
| #else | |
| (*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 | |
| e_free(*root); | e_free(*root); | 
| *root = NULL; | *root = NULL; | 
| Line 1109 schedResumeby(sched_root_task_t * __restrict root, u_c | Line 1127 schedResumeby(sched_root_task_t * __restrict root, u_c | 
| SCHED_QUNLOCK(root, taskSUSPEND); | SCHED_QUNLOCK(root, taskSUSPEND); | 
| return flg; | return flg; | 
| } | |
| static void * | |
| _sched_sigDisp(void *arg) | |
| { | |
| sched_root_task_t *root = arg; | |
| sched_task_t *task, *tmp; | |
| int sig, flg; | |
| sigset_t ss; | |
| sigfillset(&ss); | |
| while (root->root_sigthr) { | |
| if (sigwait(&ss, &sig)) | |
| continue; | |
| pthread_mutex_lock(&root->root_sigmtx); | |
| if (!sigismember(&root->root_sigset, sig)) { | |
| pthread_mutex_unlock(&root->root_sigmtx); | |
| continue; | |
| } | |
| flg = 0; | |
| TAILQ_FOREACH_SAFE(task, &root->root_signal, task_node, tmp) { | |
| if (TASK_VAL(task) == (uintptr_t) sig) { | |
| if (!flg) { | |
| TASK_RET(task) = 0; | |
| TASK_FLAG(task) = 0; | |
| /* remove signal handle */ | |
| transit_task2ready(task, &root->root_signal); | |
| } | |
| flg++; | |
| } | |
| } | |
| if (flg < 2) | |
| sigdelset(&root->root_sigset, sig); | |
| pthread_mutex_unlock(&root->root_sigmtx); | |
| } | |
| return NULL; | |
| } | |
| /* | |
| * schedSignalDispatch() - Activate or Deactivate signal dispatcher | |
| * | |
| * @root = root task | |
| * @on = Activate or =0 deactivate | |
| * return: -1 error or 0 ok | |
| */ | |
| int | |
| schedSignalDispatch(sched_root_task_t * __restrict root, int on) | |
| { | |
| sigset_t ss; | |
| #ifndef HAVE_LIBPTHREAD | |
| sched_SetErr(ENOTSUP, "Library has not support pthreads"); | |
| return -1; | |
| #else | |
| pthread_attr_t attr; | |
| #endif | |
| #if SUP_ENABLE == KQ_SUPPORT | |
| return 0; | |
| #endif | |
| if (!on) { | |
| pthread_cancel(root->root_sigthr); | |
| #ifdef __linux__ | |
| root->root_sigthr = 0L; | |
| #else | |
| root->root_sigthr = NULL; | |
| #endif | |
| pthread_sigmask(SIG_SETMASK, &root->root_oldset, NULL); | |
| pthread_mutex_unlock(&root->root_sigmtx); | |
| return 0; | |
| } | |
| pthread_attr_init(&attr); | |
| pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); | |
| #ifdef SCHED_RR | |
| pthread_attr_setschedpolicy(&attr, SCHED_RR); | |
| #else | |
| pthread_attr_setschedpolicy(&attr, SCHED_OTHER); | |
| #endif | |
| sigfillset(&ss); | |
| pthread_sigmask(SIG_BLOCK, &ss, &root->root_oldset); | |
| if (pthread_create(&root->root_sigthr, &attr, _sched_sigDisp, root)) { | |
| sched_SetErr(errno, "pthread_create(SignalDispatch) #%d - %s", | |
| 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 0; | |
| } | } |