--- libaitsched/src/aitsched.c 2023/01/18 23:46:18 1.30 +++ libaitsched/src/aitsched.c 2023/02/23 15:39:07 1.30.2.2 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsched.c,v 1.30 2023/01/18 23:46:18 misho Exp $ +* $Id: aitsched.c,v 1.30.2.2 2023/02/23 15:39:07 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -386,6 +386,11 @@ schedEnd(sched_root_task_t ** __restrict root) SCHED_QUNLOCK(*root, i); pthread_mutex_destroy(&(*root)->root_mtx[i]); } + + if ((*root)->root_sigthr) { + pthread_cancel((*root)->root_sigthr); + (*root)->root_sigthr = NULL; + } #endif e_free(*root); @@ -1109,4 +1114,63 @@ schedResumeby(sched_root_task_t * __restrict root, u_c SCHED_QUNLOCK(root, taskSUSPEND); return flg; +} + +static void * +_sched_sigDisp(void *arg) +{ + sched_root_task_t *sched = arg; + sigset_t ss; + int sig; + + sigfillset(&ss); + while (sched->root_sigthr) { + sigwait(&ss, &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 (!on) { + pthread_cancel(root->root_sigthr); + root->root_sigthr = NULL; + 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; }