Diff for /libaitsched/src/hooks.c between versions 1.14 and 1.19

version 1.14, 2012/08/21 12:54:39 version 1.19, 2013/08/15 19:10:48
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, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
         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 110  sched_hook_cancel(void *task, void *arg __unused) Line 110  sched_hook_cancel(void *task, void *arg __unused)
 #ifdef AIO_SUPPORT  #ifdef AIO_SUPPORT
         struct aiocb *acb;          struct aiocb *acb;
 #ifdef EVFILT_LIO  #ifdef EVFILT_LIO
           register int i = 0;
         struct aiocb **acbs;          struct aiocb **acbs;
         register int i;  
 #endif  /* EVFILT_LIO */  #endif  /* EVFILT_LIO */
 #endif  /* AIO_SUPPORT */  #endif  /* AIO_SUPPORT */
   
Line 162  sched_hook_cancel(void *task, void *arg __unused) Line 162  sched_hook_cancel(void *task, void *arg __unused)
 #else  #else
                         EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, EV_DELETE, 0, 0, (void*) TASK_VAL(t));                          EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, EV_DELETE, 0, 0, (void*) TASK_VAL(t));
 #endif  #endif
                           /* restore signal */
                           signal(TASK_VAL(t), SIG_DFL);
                         break;                          break;
 #ifdef AIO_SUPPORT  #ifdef AIO_SUPPORT
                 case taskAIO:                  case taskAIO:
Line 206  sched_hook_cancel(void *task, void *arg __unused) Line 208  sched_hook_cancel(void *task, void *arg __unused)
                         EV_SET(&chg[0], TASK_VAL(t), EVFILT_USER, EV_DELETE, 0, 0, (void*) TASK_VAL(t));                          EV_SET(&chg[0], TASK_VAL(t), EVFILT_USER, EV_DELETE, 0, 0, (void*) TASK_VAL(t));
 #endif  #endif
                         break;                          break;
#endif#endif  /* EVFILT_USER */
                 case taskTHREAD:                  case taskTHREAD:
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                         pthread_cancel((pthread_t) TASK_VAL(t));                          pthread_cancel((pthread_t) TASK_VAL(t));
 #endif  #endif
                        TASK_UNLOCK(t);                        return NULL;
 #if defined(HAVE_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME)
                 case taskRTC:
                         timer_delete((timer_t) TASK_FLAG(t));
                         schedCancel((sched_task_t*) TASK_RET(t));
                         return NULL;
 #endif  /* HAVE_TIMER_CREATE */
                 default:                  default:
                         return NULL;                          return NULL;
         }          }
Line 233  sched_hook_thread(void *task, void *arg) Line 241  sched_hook_thread(void *task, void *arg)
 {  {
         sched_task_t *t = task;          sched_task_t *t = task;
         pthread_t tid;          pthread_t tid;
           sigset_t s, o;
   
         if (!t || !TASK_ROOT(t))          if (!t || !TASK_ROOT(t))
                 return (void*) -1;                  return (void*) -1;
   
        if (pthread_create(&tid, (pthread_attr_t*) arg,         sigfillset(&s);
                                (void *(*)(void*)) TASK_FUNC(t), t)) {        pthread_sigmask(SIG_BLOCK, &s, &o);
         if ((errno = pthread_create(&tid, (pthread_attr_t*) arg, 
                                 (void *(*)(void*)) _sched_threadWrapper, t))) {
                 LOGERR;                  LOGERR;
                   pthread_sigmask(SIG_SETMASK, &o, NULL);
                 return (void*) -1;                  return (void*) -1;
        }        } else
                 TASK_VAL(t) = (u_long) tid;
   
         if (!TASK_ISLOCKED(t))          if (!TASK_ISLOCKED(t))
                 TASK_LOCK(t);                  TASK_LOCK(t);
   
        TASK_VAL(t) = (u_long) tid;        pthread_sigmask(SIG_SETMASK, &o, NULL);
         return NULL;          return NULL;
 }  }
 #endif  #endif
Line 335  sched_hook_alarm(void *task, void *arg __unused) Line 348  sched_hook_alarm(void *task, void *arg __unused)
                 return (void*) -1;                  return (void*) -1;
   
 #ifdef __NetBSD__  #ifdef __NetBSD__
        EV_SET(&chg[0], (uintptr_t) TASK_DATA(t), EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0,         EV_SET(&chg[0], (uintptr_t) TASK_DATA(t), EVFILT_TIMER, EV_ADD | EV_CLEAR, 0, 
                         t->task_val.ts.tv_sec * 1000 + t->task_val.ts.tv_nsec / 1000000,                           t->task_val.ts.tv_sec * 1000 + t->task_val.ts.tv_nsec / 1000000, 
                         (intptr_t) TASK_DATA(t));                          (intptr_t) TASK_DATA(t));
 #else  #else
        EV_SET(&chg[0], (uintptr_t) TASK_DATA(t), EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0,         EV_SET(&chg[0], (uintptr_t) TASK_DATA(t), EVFILT_TIMER, EV_ADD | EV_CLEAR, 0, 
                         t->task_val.ts.tv_sec * 1000 + t->task_val.ts.tv_nsec / 1000000,                           t->task_val.ts.tv_sec * 1000 + t->task_val.ts.tv_nsec / 1000000, 
                         (void*) TASK_DATA(t));                          (void*) TASK_DATA(t));
 #endif  #endif
Line 443  sched_hook_signal(void *task, void *arg __unused) Line 456  sched_hook_signal(void *task, void *arg __unused)
         if (!t || !TASK_ROOT(t))          if (!t || !TASK_ROOT(t))
                 return (void*) -1;                  return (void*) -1;
   
           /* ignore signal */
           signal(TASK_VAL(t), SIG_IGN);
   
 #ifdef __NetBSD__  #ifdef __NetBSD__
        EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, EV_ADD, 0, 0, (intptr_t) TASK_VAL(t));        EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, EV_ADD | EV_CLEAR, 0, 0, (intptr_t) TASK_VAL(t));
 #else  #else
        EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, EV_ADD, 0, 0, (void*) TASK_VAL(t));        EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, EV_ADD | EV_CLEAR, 0, 0, (void*) TASK_VAL(t));
 #endif  #endif
         if (kevent(TASK_ROOT(t)->root_kq, chg, 1, NULL, 0, &timeout) == -1) {          if (kevent(TASK_ROOT(t)->root_kq, chg, 1, NULL, 0, &timeout) == -1) {
                 if (TASK_ROOT(t)->root_hooks.hook_exec.exception)                  if (TASK_ROOT(t)->root_hooks.hook_exec.exception)
Line 631  sched_hook_fetch(void *root, void *arg __unused) Line 647  sched_hook_fetch(void *root, void *arg __unused)
                                         else {                                          else {
                                                 flg++;                                                  flg++;
                                                 TASK_RET(task) = res[i].data;                                                  TASK_RET(task) = res[i].data;
                                                TASK_FLAG(task) = res[i].fflags;                                                TASK_FLAG(task) = (u_long) res[i].fflags;
                                         }                                          }
                                         /* remove read handle */                                          /* remove read handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
Line 684  sched_hook_fetch(void *root, void *arg __unused) Line 700  sched_hook_fetch(void *root, void *arg __unused)
                                         else {                                          else {
                                                 flg++;                                                  flg++;
                                                 TASK_RET(task) = res[i].data;                                                  TASK_RET(task) = res[i].data;
                                                TASK_FLAG(task) = res[i].fflags;                                                TASK_FLAG(task) = (u_long) res[i].fflags;
                                         }                                          }
                                         /* remove write handle */                                          /* remove write handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
Line 737  sched_hook_fetch(void *root, void *arg __unused) Line 753  sched_hook_fetch(void *root, void *arg __unused)
                                         else {                                          else {
                                                 flg++;                                                  flg++;
                                                 TASK_RET(task) = res[i].data;                                                  TASK_RET(task) = res[i].data;
                                                TASK_FLAG(task) = res[i].fflags;                                                TASK_FLAG(task) = (u_long) res[i].fflags;
                                         }                                          }
                                         /* remove alarm handle */                                          /* remove alarm handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
Line 768  sched_hook_fetch(void *root, void *arg __unused) Line 784  sched_hook_fetch(void *root, void *arg __unused)
                                         else {                                          else {
                                                 flg++;                                                  flg++;
                                                 TASK_RET(task) = res[i].data;                                                  TASK_RET(task) = res[i].data;
                                                TASK_FLAG(task) = res[i].fflags;                                                TASK_FLAG(task) = (u_long) res[i].fflags;
                                         }                                          }
                                         /* remove node handle */                                          /* remove node handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
Line 799  sched_hook_fetch(void *root, void *arg __unused) Line 815  sched_hook_fetch(void *root, void *arg __unused)
                                         else {                                          else {
                                                 flg++;                                                  flg++;
                                                 TASK_RET(task) = res[i].data;                                                  TASK_RET(task) = res[i].data;
                                                TASK_FLAG(task) = res[i].fflags;                                                TASK_FLAG(task) = (u_long) res[i].fflags;
                                         }                                          }
                                         /* remove proc handle */                                          /* remove proc handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
Line 830  sched_hook_fetch(void *root, void *arg __unused) Line 846  sched_hook_fetch(void *root, void *arg __unused)
                                         else {                                          else {
                                                 flg++;                                                  flg++;
                                                 TASK_RET(task) = res[i].data;                                                  TASK_RET(task) = res[i].data;
                                                TASK_FLAG(task) = res[i].fflags;                                                TASK_FLAG(task) = (u_long) res[i].fflags;
                                         }                                          }
                                         /* remove signal handle */                                          /* remove signal handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
Line 863  sched_hook_fetch(void *root, void *arg __unused) Line 879  sched_hook_fetch(void *root, void *arg __unused)
                                         else {                                          else {
                                                 flg++;                                                  flg++;
                                                 TASK_RET(task) = res[i].data;                                                  TASK_RET(task) = res[i].data;
                                                TASK_FLAG(task) = res[i].fflags;                                                TASK_FLAG(task) = (u_long) res[i].fflags;
                                         }                                          }
                                         /* remove user handle */                                          /* remove user handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
Line 905  sched_hook_fetch(void *root, void *arg __unused) Line 921  sched_hook_fetch(void *root, void *arg __unused)
                                         else {                                          else {
                                                 flg++;                                                  flg++;
                                                 TASK_RET(task) = res[i].data;                                                  TASK_RET(task) = res[i].data;
                                                TASK_FLAG(task) = res[i].fflags;                                                TASK_FLAG(task) = (u_long) res[i].fflags;
                                         }                                          }
                                         /* remove user handle */                                          /* remove user handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
Line 955  sched_hook_fetch(void *root, void *arg __unused) Line 971  sched_hook_fetch(void *root, void *arg __unused)
                                         else {                                          else {
                                                 flg++;                                                  flg++;
                                                 TASK_RET(task) = res[i].data;                                                  TASK_RET(task) = res[i].data;
                                                TASK_FLAG(task) = res[i].fflags;                                                TASK_FLAG(task) = (u_long) res[i].fflags;
                                         }                                          }
                                         /* remove user handle */                                          /* remove user handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
Line 1108  sched_hook_condition(void *root, void *arg) Line 1124  sched_hook_condition(void *root, void *arg)
   
         return (void*) (r->root_cond - *(intptr_t*) arg);          return (void*) (r->root_cond - *(intptr_t*) arg);
 }  }
   
   /*
    * sched_hook_rtc() - Default RTC hook
    *
    * @task = current task
    * @arg = unused
    * return: <0 errors and 0 ok
    */
   #if defined(HAVE_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME)
   void *
   sched_hook_rtc(void *task, void *arg __unused)
   {
           sched_task_t *sigt = NULL, *t = task;
           struct itimerspec its;
           struct sigevent evt;
           timer_t tmr;
   
           if (!t || !TASK_ROOT(t))
                   return (void*) -1;
   
           memset(&evt, 0, sizeof evt);
           evt.sigev_notify = SIGEV_SIGNAL;
           evt.sigev_signo = (int) TASK_DATA(t) + SIGRTMIN;
           evt.sigev_value.sival_ptr = TASK_DATA(t);
   
           if (timer_create(CLOCK_MONOTONIC, &evt, &tmr) == -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;
           } else
                   TASK_FLAG(t) = (u_long) tmr;
   
           if (!(sigt = schedSignal(TASK_ROOT(t), TASK_FUNC(t), TASK_ARG(t), evt.sigev_signo, 
                                   TASK_DATA(t), (size_t) tmr))) {
                   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;
           } else
                   TASK_RET(t) = (uintptr_t) sigt;
   
           memset(&its, 0, sizeof its);
           its.it_value.tv_sec = t->task_val.ts.tv_sec;
           its.it_value.tv_nsec = t->task_val.ts.tv_nsec;
   
           if (timer_settime(tmr, TIMER_RELTIME, &its, 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;
                   schedCancel(sigt);
                   timer_delete(tmr);
                   return (void*) -1;
           }
   
           return NULL;
   }
   #endif  /* HAVE_TIMER_CREATE */

Removed from v.1.14  
changed lines
  Added in v.1.19


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