Diff for /libaitsched/src/aitsched.c between versions 1.30.2.2 and 1.35.2.1

version 1.30.2.2, 2023/02/23 15:39:07 version 1.35.2.1, 2024/02/26 12:56:21
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004 - 2023Copyright 2004 - 2024
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
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 211  schedInit(void ** __restrict data, size_t datlen) Line 211  schedInit(void ** __restrict data, size_t datlen)
 {  {
         sched_root_task_t *root = NULL;          sched_root_task_t *root = NULL;
         int (*func)(sched_root_task_t *);          int (*func)(sched_root_task_t *);
   #if SUP_ENABLE == KQ_SUPPORT
           sigset_t ss;
   #endif
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
         register int i;          register int i;
 #endif  #endif
Line 228  schedInit(void ** __restrict data, size_t datlen) Line 231  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 271  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]);
   
   #if SUP_ENABLE == KQ_SUPPORT
                   sigfillset(&ss);
                   pthread_sigmask(SIG_BLOCK, &ss, &root->root_oldset);
   #else
                   pthread_sigmask(SIG_BLOCK, NULL, &root->root_oldset);
 #endif  #endif
   #else
                   sigprocmask(SIG_BLOCK, NULL, &root->root_oldset);
   #endif
   
                 if (data && *data) {                  if (data && *data) {
                         if (datlen) {                          if (datlen) {
Line 389  schedEnd(sched_root_task_t ** __restrict root) Line 407  schedEnd(sched_root_task_t ** __restrict root)
   
         if ((*root)->root_sigthr) {          if ((*root)->root_sigthr) {
                 pthread_cancel((*root)->root_sigthr);                  pthread_cancel((*root)->root_sigthr);
   #ifdef __linux__
                   (*root)->root_sigthr = 0L;
   #else
                 (*root)->root_sigthr = NULL;                  (*root)->root_sigthr = NULL;
   #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 1119  schedResumeby(sched_root_task_t * __restrict root, u_c Line 1146  schedResumeby(sched_root_task_t * __restrict root, u_c
 static void *  static void *
 _sched_sigDisp(void *arg)  _sched_sigDisp(void *arg)
 {  {
        sched_root_task_t *sched = arg;        sched_root_task_t *root = arg;
         sched_task_t *task, *tmp;
         int sig, flg;
         sigset_t ss;          sigset_t ss;
         int sig;  
   
         sigfillset(&ss);          sigfillset(&ss);
        while (sched->root_sigthr) {        while (root->root_sigthr) {
                sigwait(&ss, &sig);                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;          return NULL;
Line 1143  int Line 1195  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 1150  schedSignalDispatch(sched_root_task_t * __restrict roo Line 1203  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);                if (root->root_sigthr)
                         pthread_cancel(root->root_sigthr);
 #ifdef __linux__
                 root->root_sigthr = 0L;
 #else
                 root->root_sigthr = NULL;                  root->root_sigthr = NULL;
   #endif
                 return 0;                  return 0;
         }          }
   
           /* if we have already started signal thread, then skip routine */
           if (root->root_sigthr)
                   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 1166  schedSignalDispatch(sched_root_task_t * __restrict roo Line 1236  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;
         }          }
   

Removed from v.1.30.2.2  
changed lines
  Added in v.1.35.2.1


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>