|
|
| version 1.30, 2023/01/18 23:46:18 | version 1.30.2.5, 2023/02/24 15:49:01 |
|---|---|
| Line 386 schedEnd(sched_root_task_t ** __restrict root) | Line 386 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 |
| } | |
| #endif | |
| e_free(*root); | e_free(*root); |
| *root = NULL; | *root = NULL; |
| Line 1109 schedResumeby(sched_root_task_t * __restrict root, u_c | Line 1118 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; | |
| while (root->root_sigthr) { | |
| if (sigwait(&root->root_sigset, &sig)) | |
| 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); | |
| } | |
| 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 | |
| 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, NULL); | |
| if (pthread_create(&root->root_sigthr, &attr, _sched_sigDisp, root)) { | |
| sched_SetErr(errno, "pthread_create(SignalDispatch) #%d - %s", | |
| errno, strerror(errno)); | |
| return -1; | |
| } | |
| return 0; | |
| } | } |