Diff for /libaitsched/src/hooks.c between versions 1.1.1.1.2.4 and 1.2.2.1

version 1.1.1.1.2.4, 2011/08/11 22:55:28 version 1.2.2.1, 2011/10/04 13:29:00
Line 118  sched_hook_cancel(void *task, void *arg __unused) Line 118  sched_hook_cancel(void *task, void *arg __unused)
 {  {
         struct sched_IO *io;          struct sched_IO *io;
         sched_task_t *t = task;          sched_task_t *t = task;
        struct kevent chg[2];        struct kevent chg[1];
         struct timespec timeout = { 0, 0 };          struct timespec timeout = { 0, 0 };
   
         if (!t || !t->task_root || !ROOT_DATA(t->task_root) || !ROOT_DATLEN(t->task_root))          if (!t || !t->task_root || !ROOT_DATA(t->task_root) || !ROOT_DATLEN(t->task_root))
Line 129  sched_hook_cancel(void *task, void *arg __unused) Line 129  sched_hook_cancel(void *task, void *arg __unused)
         switch (t->task_type) {          switch (t->task_type) {
                 case taskREAD:                  case taskREAD:
 #ifdef __NetBSD__  #ifdef __NetBSD__
                        EV_SET(&chg[1], TASK_FD(t), EVFILT_READ, EV_DELETE, 0, 0, (intptr_t) &TASK_FD(t));                        EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_DELETE, 0, 0, (intptr_t) TASK_FD(t));
 #else  #else
                        EV_SET(&chg[1], TASK_FD(t), EVFILT_READ, EV_DELETE, 0, 0, &TASK_FD(t));                        EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_DELETE, 0, 0, (void*) TASK_FD(t));
 #endif  #endif
                        if (FD_ISSET(TASK_FD(t), &io->wfd))                        kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout);
#ifdef __NetBSD__ 
                                EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, (intptr_t) &TASK_FD(t)); 
#else 
                                EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, &TASK_FD(t)); 
#endif 
                        else 
#ifdef __NetBSD__ 
                                EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_DELETE, 0, 0, (intptr_t) &TASK_FD(t)); 
#else 
                                EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_DELETE, 0, 0, &TASK_FD(t)); 
#endif 
                        kevent(t->task_root->root_kq, chg, 2, NULL, 0, &timeout); 
 
                         FD_CLR(TASK_FD(t), &io->rfd);                          FD_CLR(TASK_FD(t), &io->rfd);
                         break;                          break;
                 case taskWRITE:                  case taskWRITE:
 #ifdef __NetBSD__  #ifdef __NetBSD__
                        EV_SET(&chg[1], TASK_FD(t), EVFILT_WRITE, EV_DELETE, 0, 0, (intptr_t) &TASK_FD(t));                        EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_DELETE, 0, 0, (intptr_t) TASK_FD(t));
 #else  #else
                        EV_SET(&chg[1], TASK_FD(t), EVFILT_WRITE, EV_DELETE, 0, 0, &TASK_FD(t));                        EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_DELETE, 0, 0, (void*) TASK_FD(t));
 #endif  #endif
                        if (FD_ISSET(TASK_FD(t), &io->rfd))                        kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout);
#ifdef __NetBSD__ 
                                EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, (intptr_t) &TASK_FD(t)); 
#else 
                                EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, &TASK_FD(t)); 
#endif 
                        else 
#ifdef __NetBSD__ 
                                EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_DELETE, 0, 0, (intptr_t) &TASK_FD(t)); 
#else 
                                EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_DELETE, 0, 0, &TASK_FD(t)); 
#endif 
                        kevent(t->task_root->root_kq, chg, 2, NULL, 0, &timeout); 
 
                         FD_CLR(TASK_FD(t), &io->wfd);                          FD_CLR(TASK_FD(t), &io->wfd);
                         break;                          break;
                 default:                  default:
Line 203  sched_hook_read(void *task, void *arg __unused) Line 177  sched_hook_read(void *task, void *arg __unused)
                 FD_SET(TASK_FD(t), &io->rfd);                  FD_SET(TASK_FD(t), &io->rfd);
   
 #ifdef __NetBSD__  #ifdef __NetBSD__
        EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, (intptr_t) &TASK_FD(t));        EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, (intptr_t) TASK_FD(t));
 #else  #else
        EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, &TASK_FD(t));        EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, (void*) TASK_FD(t));
 #endif  #endif
         if (kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout) == -1) {          if (kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout) == -1) {
                LOGERR;                if (t->task_root->root_hooks.hook_exec.exception)
                         t->task_root->root_hooks.hook_exec.exception(t->task_root, NULL);
                 return (void*) -1;                  return (void*) -1;
         }          }
   
Line 240  sched_hook_write(void *task, void *arg __unused) Line 215  sched_hook_write(void *task, void *arg __unused)
                 FD_SET(TASK_FD(t), &io->wfd);                  FD_SET(TASK_FD(t), &io->wfd);
   
 #ifdef __NetBSD__  #ifdef __NetBSD__
        EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, (intptr_t) &TASK_FD(t));        EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, (intptr_t) TASK_FD(t));
 #else  #else
        EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, &TASK_FD(t));        EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, (void*) TASK_FD(t));
 #endif  #endif
         if (kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout) == -1) {          if (kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout) == -1) {
                LOGERR;                if (t->task_root->root_hooks.hook_exec.exception)
                         t->task_root->root_hooks.hook_exec.exception(t->task_root, NULL);
                 return (void*) -1;                  return (void*) -1;
         }          }
   
Line 334  retry: Line 310  retry:
         } else  /* wait INFTIM */          } else  /* wait INFTIM */
                 timeout = NULL;                  timeout = NULL;
         if ((en = kevent(r->root_kq, NULL, 0, res, KQ_EVENTS, timeout)) == -1) {          if ((en = kevent(r->root_kq, NULL, 0, res, KQ_EVENTS, timeout)) == -1) {
                LOGERR;                if (r->root_hooks.hook_exec.exception)
                         if (r->root_hooks.hook_exec.exception(r, NULL))
                                 return NULL;    /* exit from scheduler */
 #ifdef NDEBUG
                 /* kevent no exit by error, if non-debug version */
                 goto retry;                  goto retry;
   #else
                   /* diagnostic exit from scheduler if kevent error occur */
                   return NULL;
   #endif
         }          }
   
         nw.tv_sec = nw.tv_nsec = 0;          nw.tv_sec = nw.tv_nsec = 0;
Line 347  retry: Line 331  retry:
                 switch (res[i].filter) {                  switch (res[i].filter) {
                         case EVFILT_READ:                          case EVFILT_READ:
                                 TAILQ_FOREACH(task, &r->root_read, task_node) {                                  TAILQ_FOREACH(task, &r->root_read, task_node) {
                                        if (TASK_FD(task) != *((int*) res[i].udata))                                        if (TASK_FD(task) != ((int) res[i].udata))
                                                 continue;                                                  continue;
                                         /* remove read handle */                                          /* remove read handle */
                                         io = ROOT_DATA(task->task_root);                                          io = ROOT_DATA(task->task_root);
                                         FD_CLR(TASK_FD(task), &io->rfd);                                          FD_CLR(TASK_FD(task), &io->rfd);
   
                                         TAILQ_REMOVE(&r->root_read, task, task_node);                                          TAILQ_REMOVE(&r->root_read, task, task_node);
                                        task->task_type = taskREADY;                                        if (r->root_hooks.hook_exec.exception && res[i].flags & EV_EOF) {
                                        TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);                                                if (r->root_hooks.hook_exec.exception(r, (void*) EV_EOF)) {
                                                         task->task_type = taskUNUSE;
                                                         TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node);
                                                 } else {
                                                         task->task_type = taskREADY;
                                                         TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);
                                                 }
                                         } else {
                                                 task->task_type = taskREADY;
                                                 TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);
                                         }
                                         break;                                          break;
                                 }                                  }
                                 break;                                  break;
                         case EVFILT_WRITE:                          case EVFILT_WRITE:
                                 TAILQ_FOREACH(task, &r->root_write, task_node) {                                  TAILQ_FOREACH(task, &r->root_write, task_node) {
                                        if (TASK_FD(task) != *((int*) res[i].udata))                                        if (TASK_FD(task) != ((int) res[i].udata))
                                                 continue;                                                  continue;
                                         /* remove write handle */                                          /* remove write handle */
                                         io = ROOT_DATA(task->task_root);                                          io = ROOT_DATA(task->task_root);
                                         FD_CLR(TASK_FD(task), &io->wfd);                                          FD_CLR(TASK_FD(task), &io->wfd);
   
                                         TAILQ_REMOVE(&r->root_write, task, task_node);                                          TAILQ_REMOVE(&r->root_write, task, task_node);
                                        task->task_type = taskREADY;                                        if (r->root_hooks.hook_exec.exception && res[i].flags & EV_EOF) {
                                        TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);                                                if (r->root_hooks.hook_exec.exception(r, (void*) EV_EOF)) {
                                                         task->task_type = taskUNUSE;
                                                         TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node);
                                                 } else {
                                                         task->task_type = taskREADY;
                                                         TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);
                                                 }
                                         } else {
                                                 task->task_type = taskREADY;
                                                 TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);
                                         }
                                         break;                                          break;
                                 }                                  }
                                 break;                                  break;
                 }                  }
   
                 if (kevent(r->root_kq, evt, 1, NULL, 0, &nw) == -1)                  if (kevent(r->root_kq, evt, 1, NULL, 0, &nw) == -1)
                        LOGERR;                        if (r->root_hooks.hook_exec.exception)
                                 if (r->root_hooks.hook_exec.exception(r, NULL))
                                         return NULL;    /* exit from scheduler */
         }          }
   
        /* timer update */        /* timer update & put in ready queue */
         clock_gettime(CLOCK_MONOTONIC, &nw);          clock_gettime(CLOCK_MONOTONIC, &nw);
         now.tv_sec = nw.tv_sec;          now.tv_sec = nw.tv_sec;
         now.tv_usec = nw.tv_nsec / 1000;          now.tv_usec = nw.tv_nsec / 1000;
Line 414  retry: Line 419  retry:
         return task;          return task;
 }  }
   
   /*
    * sched_hook_exception() - Default EXCEPTION hook
    * @root = root task
    * @arg = may be EV_EOF
    * return: <0 errors and 0 ok
    */
   void *
   sched_hook_exception(void *root, void *arg)
   {
           sched_root_task_t *r = root;
   
           if (!r || !ROOT_DATA(r) || !ROOT_DATLEN(r))
                   return NULL;
   
           if (arg) {
                   if (arg == (void*) EV_EOF)
                           return NULL;
                   return (void*) -1;      /* raise error */
           } else
                   LOGERR;
   
           if (errno == EINTR)
                   return (void*) -1;      /* raise error */
   
           return NULL;
   }

Removed from v.1.1.1.1.2.4  
changed lines
  Added in v.1.2.2.1


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