Diff for /libaitsched/src/hooks.c between versions 1.27.2.6 and 1.27.2.8

version 1.27.2.6, 2014/06/03 20:39:54 version 1.27.2.8, 2014/06/05 22:16:00
Line 56  transit_task2ready(sched_task_t * __restrict t, sched_ Line 56  transit_task2ready(sched_task_t * __restrict t, sched_
         insert_task_to(t, &(TASK_ROOT(t))->root_ready);          insert_task_to(t, &(TASK_ROOT(t))->root_ready);
 }  }
   
   #ifdef HAVE_LIBPTHREAD
   static void *
   _sched_threadWrapper(sched_task_t *t)
   {
           void *ret = NULL;
           sched_root_task_t *r;
   
           if (!t || !TASK_ROOT(t))
                   pthread_exit(ret);
           else
                   r = (sched_root_task_t*) TASK_ROOT(t);
   
           pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
           /*
           pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
           */
   
           /* notify parent, thread is ready for execution */
           pthread_testcancel();
   
           ret = schedCall(t);
           r->root_ret = ret;
   
           if (TASK_VAL(t)) {
                   transit_task2unuse(t, &r->root_thread);
                   TASK_VAL(t) = 0;
           }
   
           pthread_exit(ret);
   }
   #endif
   
   #if defined(HAVE_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME) && defined(HAVE_TIMER_DELETE)
   #if SUP_ENABLE == KQ_SUPPORT
   static void *
   _sched_rtcWrapper(sched_task_t *t)
   {
           sched_task_t *task;
           void *ret;
   
           if (!t || !TASK_ROOT(t) || !TASK_DATA(t))
                   return NULL;
           else {
                   task = (sched_task_t*) TASK_DATA(t);
                   timer_delete((timer_t) TASK_DATLEN(t));
           }
   
           ret = schedCall(task);
   
           transit_task2unuse(task, &(TASK_ROOT(task))->root_rtc);
           return ret;
   }
   #else
   static void
   _sched_rtcSigWrapper(int sig, siginfo_t *si, void *uc)
   {
           sched_task_t *task;
   
           if (si && si->si_value.sival_ptr) {
                   task = (sched_task_t*) si->si_value.sival_ptr;
                   timer_delete((timer_t) TASK_FLAG(task));
   
                   TASK_RET(task) = (intptr_t) schedCall(task);
   
                   transit_task2unuse(task, &(TASK_ROOT(task))->root_rtc);
           }
   }
   #endif
   #endif
   
 /*  /*
  * sched_hook_init() - Default INIT hook   * sched_hook_init() - Default INIT hook
  *   *
Line 303  sched_hook_cancel(void *task, void *arg __unused) Line 373  sched_hook_cancel(void *task, void *arg __unused)
                                         0, 0, (void*) TASK_VAL(t));                                          0, 0, (void*) TASK_VAL(t));
 #endif  #endif
                         /* restore signal */                          /* restore signal */
                        signal(TASK_VAL(t), SIG_DFL);                        if (flg < 2)
                                 signal(TASK_VAL(t), SIG_DFL);
 #endif  #endif
                         break;                          break;
 #ifdef AIO_SUPPORT  #ifdef AIO_SUPPORT
Line 398  sched_hook_cancel(void *task, void *arg __unused) Line 469  sched_hook_cancel(void *task, void *arg __unused)
 #if defined(HAVE_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME) && defined(HAVE_TIMER_DELETE)  #if defined(HAVE_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME) && defined(HAVE_TIMER_DELETE)
                 case taskRTC:                  case taskRTC:
                         timer_delete((timer_t) TASK_FLAG(t));                          timer_delete((timer_t) TASK_FLAG(t));
   #if SUP_ENABLE == KQ_SUPPORT
                         schedCancel((sched_task_t*) TASK_RET(t));                          schedCancel((sched_task_t*) TASK_RET(t));
   #else
                           /* check for multi subscribers */
                           flg = 0;
                           TAILQ_FOREACH_SAFE(tt, &r->root_rtc, task_node, tmp)
                                   if (TASK_DATA(tt) != TASK_DATA(t))
                                           continue;
                                   else
                                           flg++;
   
                           /* restore signal */
                           if (flg < 2)
                                   signal((intptr_t) TASK_DATA(t) + SIGRTMIN, SIG_DFL);
   #endif
                         return NULL;                          return NULL;
 #endif  /* HAVE_TIMER_CREATE */  #endif  /* HAVE_TIMER_CREATE */
                 default:                  default:
Line 726  sched_hook_signal(void *task, void *arg __unused) Line 811  sched_hook_signal(void *task, void *arg __unused)
                         LOGERR;                          LOGERR;
                 return (void*) -1;                  return (void*) -1;
         }          }
 #else  
 #if 0  
         sched_task_t *t = task;  
         struct sigaction sa;  
   
         memset(&sa, 0, sizeof sa);  
         sigemptyset(&sa.sa_mask);  
         sa.sa_handler = _sched_sigHandler;  
         sa.sa_flags = SA_RESETHAND | SA_RESTART;  
   
         if (sigaction(TASK_VAL(t), &sa, NULL) == -1) {  
                 if (TASK_ROOT(t)->root_hooks.hook_exec.exception)  
                         TASK_ROOT(t)->root_hooks.hook_exec.exception(TASK_ROOT(t), NULL);  
                 else  
                         LOGERR;  
                 return (void*) -1;  
         }  
 #endif  /* 0 */  
 #endif  #endif
         return NULL;          return NULL;
 }  }
Line 1233  sched_hook_fetch(void *root, void *arg __unused) Line 1300  sched_hook_fetch(void *root, void *arg __unused)
         sched_task_t *task, *tmp;          sched_task_t *task, *tmp;
         struct timespec now, m, mtmp;          struct timespec now, m, mtmp;
 #if SUP_ENABLE == KQ_SUPPORT  #if SUP_ENABLE == KQ_SUPPORT
        struct kevent evt[1], res[KQ_EVENTS];        struct kevent res[KQ_EVENTS];
         struct timespec *timeout;          struct timespec *timeout;
 #elif SUP_ENABLE == EP_SUPPORT  #elif SUP_ENABLE == EP_SUPPORT
         struct epoll_event res[KQ_EVENTS];          struct epoll_event res[KQ_EVENTS];
Line 1438  sched_hook_rtc(void *task, void *arg __unused) Line 1505  sched_hook_rtc(void *task, void *arg __unused)
         struct itimerspec its;          struct itimerspec its;
         struct sigevent evt;          struct sigevent evt;
         timer_t tmr;          timer_t tmr;
   #if SUP_ENABLE != KQ_SUPPORT
           struct sigaction sa;
   #endif
   
         if (!t || !TASK_ROOT(t))          if (!t || !TASK_ROOT(t))
                 return (void*) -1;                  return (void*) -1;
Line 1445  sched_hook_rtc(void *task, void *arg __unused) Line 1515  sched_hook_rtc(void *task, void *arg __unused)
         memset(&evt, 0, sizeof evt);          memset(&evt, 0, sizeof evt);
         evt.sigev_notify = SIGEV_SIGNAL;          evt.sigev_notify = SIGEV_SIGNAL;
         evt.sigev_signo = (intptr_t) TASK_DATA(t) + SIGRTMIN;          evt.sigev_signo = (intptr_t) TASK_DATA(t) + SIGRTMIN;
        evt.sigev_value.sival_ptr = TASK_DATA(t);        evt.sigev_value.sival_ptr = t;
   
         if (timer_create(CLOCK_MONOTONIC, &evt, &tmr) == -1) {          if (timer_create(CLOCK_MONOTONIC, &evt, &tmr) == -1) {
                 if (TASK_ROOT(t)->root_hooks.hook_exec.exception)                  if (TASK_ROOT(t)->root_hooks.hook_exec.exception)
Line 1456  sched_hook_rtc(void *task, void *arg __unused) Line 1526  sched_hook_rtc(void *task, void *arg __unused)
         } else          } else
                 TASK_FLAG(t) = (u_long) tmr;                  TASK_FLAG(t) = (u_long) tmr;
   
   #if SUP_ENABLE == KQ_SUPPORT
         if (!(sigt = schedSignal(TASK_ROOT(t), _sched_rtcWrapper, TASK_ARG(t), evt.sigev_signo,           if (!(sigt = schedSignal(TASK_ROOT(t), _sched_rtcWrapper, TASK_ARG(t), evt.sigev_signo, 
                                 t, (size_t) tmr))) {                                  t, (size_t) tmr))) {
                 if (TASK_ROOT(t)->root_hooks.hook_exec.exception)                  if (TASK_ROOT(t)->root_hooks.hook_exec.exception)
Line 1466  sched_hook_rtc(void *task, void *arg __unused) Line 1537  sched_hook_rtc(void *task, void *arg __unused)
                 return (void*) -1;                  return (void*) -1;
         } else          } else
                 TASK_RET(t) = (uintptr_t) sigt;                  TASK_RET(t) = (uintptr_t) sigt;
   #else
           memset(&sa, 0, sizeof sa);
           sigemptyset(&sa.sa_mask);
           sa.sa_sigaction = _sched_rtcSigWrapper;
           sa.sa_flags = SA_SIGINFO | SA_RESTART;
   
           if (sigaction(evt.sigev_signo, &sa, NULL) == -1) {
                   if (TASK_ROOT(t)->root_hooks.hook_exec.exception)
                           TASK_ROOT(t)->root_hooks.hook_exec.exception(TASK_ROOT(t), NULL);
                   else
                           LOGERR;
                   timer_delete(tmr);
                   return (void*) -1;
           }
   #endif
   
         memset(&its, 0, sizeof its);          memset(&its, 0, sizeof its);
         its.it_value.tv_sec = t->task_val.ts.tv_sec;          its.it_value.tv_sec = t->task_val.ts.tv_sec;

Removed from v.1.27.2.6  
changed lines
  Added in v.1.27.2.8


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