Diff for /libaitsched/src/hooks.c between versions 1.7.2.1 and 1.10

version 1.7.2.1, 2012/05/31 14:17:59 version 1.10, 2012/07/24 14:06:11
Line 156  sched_hook_cancel(void *task, void *arg __unused) Line 156  sched_hook_cancel(void *task, void *arg __unused)
                         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
                         break;                          break;
   #ifdef EVFILT_USER
                 case taskUSER:                  case taskUSER:
 #ifdef __NetBSD__  #ifdef __NetBSD__
                         EV_SET(&chg[0], TASK_VAL(t), EVFILT_USER, EV_DELETE, 0, 0, (intptr_t) TASK_VAL(t));                          EV_SET(&chg[0], TASK_VAL(t), EVFILT_USER, EV_DELETE, 0, 0, (intptr_t) TASK_VAL(t));
Line 163  sched_hook_cancel(void *task, void *arg __unused) Line 164  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
                 default:                  default:
                        return (void*) -1;                        return NULL;
         }          }
   
         kevent(TASK_ROOT(t)->root_kq, chg, 1, NULL, 0, &timeout);          kevent(TASK_ROOT(t)->root_kq, chg, 1, NULL, 0, &timeout);
Line 386  sched_hook_signal(void *task, void *arg __unused) Line 388  sched_hook_signal(void *task, void *arg __unused)
  * @arg = unused   * @arg = unused
  * return: <0 errors and 0 ok   * return: <0 errors and 0 ok
  */   */
   #ifdef EVFILT_USER
 void *  void *
 sched_hook_user(void *task, void *arg __unused)  sched_hook_user(void *task, void *arg __unused)
 {  {
Line 397  sched_hook_user(void *task, void *arg __unused) Line 400  sched_hook_user(void *task, void *arg __unused)
                 return (void*) -1;                  return (void*) -1;
   
 #ifdef __NetBSD__  #ifdef __NetBSD__
        EV_SET(&chg[0], TASK_VAL(t), EVFILT_USER, EV_ADD | EV_CLEAR, NOTE_FFNOP, 0, (intptr_t) TASK_VAL(t));        EV_SET(&chg[0], TASK_VAL(t), EVFILT_USER, EV_ADD | EV_CLEAR, TASK_DATLEN(t), 
                         0, (intptr_t) TASK_VAL(t));
 #else  #else
        EV_SET(&chg[0], TASK_VAL(t), EVFILT_USER, EV_ADD | EV_CLEAR, NOTE_FFNOP, 0, (void*) TASK_VAL(t));        EV_SET(&chg[0], TASK_VAL(t), EVFILT_USER, EV_ADD | EV_CLEAR, TASK_DATLEN(t), 
                         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 411  sched_hook_user(void *task, void *arg __unused) Line 416  sched_hook_user(void *task, void *arg __unused)
   
         return NULL;          return NULL;
 }  }
   #endif
   
 /*  /*
  * sched_hook_fetch() - Default FETCH hook   * sched_hook_fetch() - Default FETCH hook
Line 427  sched_hook_fetch(void *root, void *arg __unused) Line 433  sched_hook_fetch(void *root, void *arg __unused)
         struct timespec now, m, mtmp;          struct timespec now, m, mtmp;
         struct timespec *timeout;          struct timespec *timeout;
         struct kevent evt[1], res[KQ_EVENTS];          struct kevent evt[1], res[KQ_EVENTS];
        register int i;        register int i, flg;
         int en;          int en;
   
         if (!r)          if (!r)
Line 529  sched_hook_fetch(void *root, void *arg __unused) Line 535  sched_hook_fetch(void *root, void *arg __unused)
                 /* Put read/write task to ready queue */                  /* Put read/write task to ready queue */
                 switch (res[i].filter) {                  switch (res[i].filter) {
                         case EVFILT_READ:                          case EVFILT_READ:
                                   flg = 0;
                                 TAILQ_FOREACH_SAFE(task, &r->root_read, task_node, tmp) {                                  TAILQ_FOREACH_SAFE(task, &r->root_read, task_node, tmp) {
                                         if (TASK_FD(task) != ((intptr_t) res[i].udata))                                          if (TASK_FD(task) != ((intptr_t) res[i].udata))
                                                 continue;                                                  continue;
                                           else
                                                   flg++;
                                         /* remove read handle */                                          /* remove read handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                                         pthread_mutex_lock(&r->root_mtx[taskREAD]);                                          pthread_mutex_lock(&r->root_mtx[taskREAD]);
Line 570  sched_hook_fetch(void *root, void *arg __unused) Line 579  sched_hook_fetch(void *root, void *arg __unused)
                                                 pthread_mutex_unlock(&r->root_mtx[taskREADY]);                                                  pthread_mutex_unlock(&r->root_mtx[taskREADY]);
 #endif  #endif
                                         }                                          }
                                         break;  
                                 }                                  }
                                   /* if match at least 2, don't remove resouce of event */
                                   if (flg > 1)
                                           evt->flags ^= evt->flags;
                                 break;                                  break;
                         case EVFILT_WRITE:                          case EVFILT_WRITE:
                                   flg = 0;
                                 TAILQ_FOREACH_SAFE(task, &r->root_write, task_node, tmp) {                                  TAILQ_FOREACH_SAFE(task, &r->root_write, task_node, tmp) {
                                         if (TASK_FD(task) != ((intptr_t) res[i].udata))                                          if (TASK_FD(task) != ((intptr_t) res[i].udata))
                                                 continue;                                                  continue;
                                           else
                                                   flg++;
                                         /* remove write handle */                                          /* remove write handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                                         pthread_mutex_lock(&r->root_mtx[taskWRITE]);                                          pthread_mutex_lock(&r->root_mtx[taskWRITE]);
Line 615  sched_hook_fetch(void *root, void *arg __unused) Line 629  sched_hook_fetch(void *root, void *arg __unused)
                                                 pthread_mutex_unlock(&r->root_mtx[taskREADY]);                                                  pthread_mutex_unlock(&r->root_mtx[taskREADY]);
 #endif  #endif
                                         }                                          }
                                         break;  
                                 }                                  }
                                   /* if match at least 2, don't remove resouce of event */
                                   if (flg > 1)
                                           evt->flags ^= evt->flags;
                                 break;                                  break;
                         case EVFILT_TIMER:                          case EVFILT_TIMER:
                                   flg = 0;
                                 TAILQ_FOREACH_SAFE(task, &r->root_alarm, task_node, tmp) {                                  TAILQ_FOREACH_SAFE(task, &r->root_alarm, task_node, tmp) {
                                         if ((uintptr_t) TASK_DATA(task) != ((uintptr_t) res[i].udata))                                          if ((uintptr_t) TASK_DATA(task) != ((uintptr_t) res[i].udata))
                                                 continue;                                                  continue;
                                           else
                                                   flg++;
                                         /* remove alarm handle */                                          /* remove alarm handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                                         pthread_mutex_lock(&r->root_mtx[taskALARM]);                                          pthread_mutex_lock(&r->root_mtx[taskALARM]);
Line 638  sched_hook_fetch(void *root, void *arg __unused) Line 657  sched_hook_fetch(void *root, void *arg __unused)
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                                         pthread_mutex_unlock(&r->root_mtx[taskREADY]);                                          pthread_mutex_unlock(&r->root_mtx[taskREADY]);
 #endif  #endif
                                         break;  
                                 }                                  }
                                   /* if match at least 2, don't remove resouce of event */
                                   if (flg > 1)
                                           evt->flags ^= evt->flags;
                                 break;                                  break;
                         case EVFILT_VNODE:                          case EVFILT_VNODE:
                                   flg = 0;
                                 TAILQ_FOREACH_SAFE(task, &r->root_node, task_node, tmp) {                                  TAILQ_FOREACH_SAFE(task, &r->root_node, task_node, tmp) {
                                         if (TASK_FD(task) != ((intptr_t) res[i].udata))                                          if (TASK_FD(task) != ((intptr_t) res[i].udata))
                                                 continue;                                                  continue;
                                           else {
                                                   flg++;
                                                   TASK_DATA(task) = (void*) (uintptr_t) res[i].data;
                                                   TASK_DATLEN(task) = res[i].fflags;
                                           }
                                         /* remove node handle */                                          /* remove node handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                                         pthread_mutex_lock(&r->root_mtx[taskNODE]);                                          pthread_mutex_lock(&r->root_mtx[taskNODE]);
Line 661  sched_hook_fetch(void *root, void *arg __unused) Line 688  sched_hook_fetch(void *root, void *arg __unused)
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                                         pthread_mutex_unlock(&r->root_mtx[taskREADY]);                                          pthread_mutex_unlock(&r->root_mtx[taskREADY]);
 #endif  #endif
                                         break;  
                                 }                                  }
                                   /* if match at least 2, don't remove resouce of event */
                                   if (flg > 1)
                                           evt->flags ^= evt->flags;
                                 break;                                  break;
                         case EVFILT_PROC:                          case EVFILT_PROC:
                                   flg = 0;
                                 TAILQ_FOREACH_SAFE(task, &r->root_proc, task_node, tmp) {                                  TAILQ_FOREACH_SAFE(task, &r->root_proc, task_node, tmp) {
                                         if (TASK_VAL(task) != ((uintptr_t) res[i].udata))                                          if (TASK_VAL(task) != ((uintptr_t) res[i].udata))
                                                 continue;                                                  continue;
                                           else {
                                                   flg++;
                                                   TASK_DATA(task) = (void*) (uintptr_t) res[i].data;
                                                   TASK_DATLEN(task) = res[i].fflags;
                                           }
                                         /* remove proc handle */                                          /* remove proc handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                                         pthread_mutex_lock(&r->root_mtx[taskPROC]);                                          pthread_mutex_lock(&r->root_mtx[taskPROC]);
Line 684  sched_hook_fetch(void *root, void *arg __unused) Line 719  sched_hook_fetch(void *root, void *arg __unused)
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                                         pthread_mutex_unlock(&r->root_mtx[taskREADY]);                                          pthread_mutex_unlock(&r->root_mtx[taskREADY]);
 #endif  #endif
                                         break;  
                                 }                                  }
                                   /* if match at least 2, don't remove resouce of event */
                                   if (flg > 1)
                                           evt->flags ^= evt->flags;
                                 break;                                  break;
                         case EVFILT_SIGNAL:                          case EVFILT_SIGNAL:
                                   flg = 0;
                                 TAILQ_FOREACH_SAFE(task, &r->root_signal, task_node, tmp) {                                  TAILQ_FOREACH_SAFE(task, &r->root_signal, task_node, tmp) {
                                         if (TASK_VAL(task) != ((uintptr_t) res[i].udata))                                          if (TASK_VAL(task) != ((uintptr_t) res[i].udata))
                                                 continue;                                                  continue;
                                           else
                                                   flg++;
                                         /* remove signal handle */                                          /* remove signal handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                                         pthread_mutex_lock(&r->root_mtx[taskSIGNAL]);                                          pthread_mutex_lock(&r->root_mtx[taskSIGNAL]);
Line 707  sched_hook_fetch(void *root, void *arg __unused) Line 747  sched_hook_fetch(void *root, void *arg __unused)
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                                         pthread_mutex_unlock(&r->root_mtx[taskREADY]);                                          pthread_mutex_unlock(&r->root_mtx[taskREADY]);
 #endif  #endif
                                         break;  
                                 }                                  }
                                   /* if match at least 2, don't remove resouce of event */
                                   if (flg > 1)
                                           evt->flags ^= evt->flags;
                                 break;                                  break;
   #ifdef EVFILT_USER
                         case EVFILT_USER:                          case EVFILT_USER:
                                   flg = 0;
                                 TAILQ_FOREACH_SAFE(task, &r->root_user, task_node, tmp) {                                  TAILQ_FOREACH_SAFE(task, &r->root_user, task_node, tmp) {
                                         if (TASK_VAL(task) != ((uintptr_t) res[i].udata))                                          if (TASK_VAL(task) != ((uintptr_t) res[i].udata))
                                                 continue;                                                  continue;
                                           else {
                                                   flg++;
                                                   TASK_DATA(task) = (void*) res[i].data;
                                                   TASK_DATLEN(task) = res[i].fflags;
                                           }
                                         /* remove user handle */                                          /* remove user handle */
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                                         pthread_mutex_lock(&r->root_mtx[taskUSER]);                                          pthread_mutex_lock(&r->root_mtx[taskUSER]);
Line 730  sched_hook_fetch(void *root, void *arg __unused) Line 779  sched_hook_fetch(void *root, void *arg __unused)
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                                         pthread_mutex_unlock(&r->root_mtx[taskREADY]);                                          pthread_mutex_unlock(&r->root_mtx[taskREADY]);
 #endif  #endif
                                         break;  
                                 }                                  }
                                   /* if match at least 2, don't remove resouce of event */
                                   if (flg > 1)
                                           evt->flags ^= evt->flags;
                                 break;                                  break;
   #endif
                 }                  }
                 if (kevent(r->root_kq, evt, 1, NULL, 0, &now) == -1) {                  if (kevent(r->root_kq, evt, 1, NULL, 0, &now) == -1) {
                         if (r->root_hooks.hook_exec.exception) {                          if (r->root_hooks.hook_exec.exception) {

Removed from v.1.7.2.1  
changed lines
  Added in v.1.10


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