Diff for /libaitsched/src/hooks.c between versions 1.3 and 1.3.4.1

version 1.3, 2011/12/08 08:02:24 version 1.3.4.1, 2012/01/08 03:28:26
Line 121  sched_hook_cancel(void *task, void *arg __unused) Line 121  sched_hook_cancel(void *task, void *arg __unused)
         struct kevent chg[1];          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 || !TASK_ROOT(t) || !ROOT_DATA(t->task_root) || !ROOT_DATLEN(t->task_root))
                 return (void*) -1;                  return (void*) -1;
         else          else
                 io = ROOT_DATA(t->task_root);                  io = ROOT_DATA(t->task_root);
   
        switch (t->task_type) {        switch (TASK_TYPE(t)) {
                 case taskREAD:                  case taskREAD:
 #ifdef __NetBSD__  #ifdef __NetBSD__
                         EV_SET(&chg[0], 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[0], TASK_FD(t), EVFILT_READ, EV_DELETE, 0, 0, (void*) TASK_FD(t));                          EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_DELETE, 0, 0, (void*) TASK_FD(t));
 #endif  #endif
                        kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout);                        kevent(TASK_ROOT(t)->root_kq, chg, 1, NULL, 0, &timeout);
                         FD_CLR(TASK_FD(t), &io->rfd);                          FD_CLR(TASK_FD(t), &io->rfd);
                         break;                          break;
                 case taskWRITE:                  case taskWRITE:
Line 142  sched_hook_cancel(void *task, void *arg __unused) Line 142  sched_hook_cancel(void *task, void *arg __unused)
 #else  #else
                         EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_DELETE, 0, 0, (void*) TASK_FD(t));                          EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_DELETE, 0, 0, (void*) TASK_FD(t));
 #endif  #endif
                        kevent(t->task_root->root_kq, chg, 1, NULL, 0, &timeout);                        kevent(TASK_ROOT(t)->root_kq, chg, 1, NULL, 0, &timeout);
                         FD_CLR(TASK_FD(t), &io->wfd);                          FD_CLR(TASK_FD(t), &io->wfd);
                         break;                          break;
                 default:                  default:
Line 166  sched_hook_read(void *task, void *arg __unused) Line 166  sched_hook_read(void *task, void *arg __unused)
         struct kevent chg[1];          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 || !TASK_ROOT(t) || !ROOT_DATA(t->task_root) || !ROOT_DATLEN(t->task_root))
                 return (void*) -1;                  return (void*) -1;
         else          else
                 io = ROOT_DATA(t->task_root);                  io = ROOT_DATA(t->task_root);
Line 181  sched_hook_read(void *task, void *arg __unused) Line 181  sched_hook_read(void *task, void *arg __unused)
 #else  #else
         EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD, 0, 0, (void*) 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(TASK_ROOT(t)->root_kq, chg, 1, NULL, 0, &timeout) == -1) {
                if (t->task_root->root_hooks.hook_exec.exception)                if (TASK_ROOT(t)->root_hooks.hook_exec.exception)
                        t->task_root->root_hooks.hook_exec.exception(t->task_root, NULL);                        TASK_ROOT(t)->root_hooks.hook_exec.exception(TASK_ROOT(t), NULL);
                 else                  else
                         LOGERR;                          LOGERR;
                 return (void*) -1;                  return (void*) -1;
Line 206  sched_hook_write(void *task, void *arg __unused) Line 206  sched_hook_write(void *task, void *arg __unused)
         struct kevent chg[1];          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 || !TASK_ROOT(t) || !ROOT_DATA(t->task_root) || !ROOT_DATLEN(t->task_root))
                 return (void*) -1;                  return (void*) -1;
         else          else
                 io = ROOT_DATA(t->task_root);                  io = ROOT_DATA(t->task_root);
Line 221  sched_hook_write(void *task, void *arg __unused) Line 221  sched_hook_write(void *task, void *arg __unused)
 #else  #else
         EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD, 0, 0, (void*) 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(TASK_ROOT(t)->root_kq, chg, 1, NULL, 0, &timeout) == -1) {
                if (t->task_root->root_hooks.hook_exec.exception)                if (TASK_ROOT(t)->root_hooks.hook_exec.exception)
                        t->task_root->root_hooks.hook_exec.exception(t->task_root, NULL);                        TASK_ROOT(t)->root_hooks.hook_exec.exception(TASK_ROOT(t), NULL);
                 else                  else
                         LOGERR;                          LOGERR;
                 return (void*) -1;                  return (void*) -1;
Line 256  sched_hook_fetch(void *root, void *arg __unused) Line 256  sched_hook_fetch(void *root, void *arg __unused)
         /* get new task by queue priority */          /* get new task by queue priority */
 retry:  retry:
         while ((task = TAILQ_FIRST(&r->root_event))) {          while ((task = TAILQ_FIRST(&r->root_event))) {
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_lock(&r->root_mtx[taskEVENT]);
   #endif
                 TAILQ_REMOVE(&r->root_event, task, task_node);                  TAILQ_REMOVE(&r->root_event, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_unlock(&r->root_mtx[taskEVENT]);
   #endif
                 task->task_type = taskUNUSE;                  task->task_type = taskUNUSE;
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_lock(&r->root_mtx[taskUNUSE]);
   #endif
                 TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node);                  TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_unlock(&r->root_mtx[taskUNUSE]);
   #endif
                 return task;                  return task;
         }          }
         while ((task = TAILQ_FIRST(&r->root_ready))) {          while ((task = TAILQ_FIRST(&r->root_ready))) {
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_lock(&r->root_mtx[taskREADY]);
   #endif
                 TAILQ_REMOVE(&r->root_ready, task, task_node);                  TAILQ_REMOVE(&r->root_ready, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_unlock(&r->root_mtx[taskREADY]);
   #endif
                 task->task_type = taskUNUSE;                  task->task_type = taskUNUSE;
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_lock(&r->root_mtx[taskUNUSE]);
   #endif
                 TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node);                  TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_unlock(&r->root_mtx[taskUNUSE]);
   #endif
                 return task;                  return task;
         }          }
   
Line 343  retry: Line 367  retry:
                                         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);
   
   #ifdef HAVE_LIBPTHREAD
                                           pthread_mutex_lock(&r->root_mtx[taskREAD]);
   #endif
                                         TAILQ_REMOVE(&r->root_read, task, task_node);                                          TAILQ_REMOVE(&r->root_read, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                                           pthread_mutex_unlock(&r->root_mtx[taskREAD]);
   #endif
                                         if (r->root_hooks.hook_exec.exception && res[i].flags & EV_EOF) {                                          if (r->root_hooks.hook_exec.exception && res[i].flags & EV_EOF) {
                                                 if (r->root_hooks.hook_exec.exception(r, (void*) EV_EOF)) {                                                  if (r->root_hooks.hook_exec.exception(r, (void*) EV_EOF)) {
                                                         task->task_type = taskUNUSE;                                                          task->task_type = taskUNUSE;
   #ifdef HAVE_LIBPTHREAD
                                                           pthread_mutex_lock(&r->root_mtx[taskUNUSE]);
   #endif
                                                         TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node);                                                          TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                                                           pthread_mutex_unlock(&r->root_mtx[taskUNUSE]);
   #endif
                                                 } else {                                                  } else {
                                                         task->task_type = taskREADY;                                                          task->task_type = taskREADY;
   #ifdef HAVE_LIBPTHREAD
                                                           pthread_mutex_lock(&r->root_mtx[taskREADY]);
   #endif
                                                         TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);                                                          TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                                                           pthread_mutex_unlock(&r->root_mtx[taskREADY]);
   #endif
                                                 }                                                  }
                                         } else {                                          } else {
                                                 task->task_type = taskREADY;                                                  task->task_type = taskREADY;
   #ifdef HAVE_LIBPTHREAD
                                                   pthread_mutex_lock(&r->root_mtx[taskREADY]);
   #endif
                                                 TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);                                                  TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                                                   pthread_mutex_unlock(&r->root_mtx[taskREADY]);
   #endif
                                         }                                          }
                                         break;                                          break;
                                 }                                  }
Line 367  retry: Line 415  retry:
                                         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);
   
   #ifdef HAVE_LIBPTHREAD
                                           pthread_mutex_lock(&r->root_mtx[taskWRITE]);
   #endif
                                         TAILQ_REMOVE(&r->root_write, task, task_node);                                          TAILQ_REMOVE(&r->root_write, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                                           pthread_mutex_unlock(&r->root_mtx[taskWRITE]);
   #endif
                                         if (r->root_hooks.hook_exec.exception && res[i].flags & EV_EOF) {                                          if (r->root_hooks.hook_exec.exception && res[i].flags & EV_EOF) {
                                                 if (r->root_hooks.hook_exec.exception(r, (void*) EV_EOF)) {                                                  if (r->root_hooks.hook_exec.exception(r, (void*) EV_EOF)) {
                                                         task->task_type = taskUNUSE;                                                          task->task_type = taskUNUSE;
   #ifdef HAVE_LIBPTHREAD
                                                           pthread_mutex_lock(&r->root_mtx[taskUNUSE]);
   #endif
                                                         TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node);                                                          TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                                                           pthread_mutex_unlock(&r->root_mtx[taskUNUSE]);
   #endif
                                                 } else {                                                  } else {
                                                         task->task_type = taskREADY;                                                          task->task_type = taskREADY;
   #ifdef HAVE_LIBPTHREAD
                                                           pthread_mutex_lock(&r->root_mtx[taskREADY]);
   #endif
                                                         TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);                                                          TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                                                           pthread_mutex_unlock(&r->root_mtx[taskREADY]);
   #endif
                                                 }                                                  }
                                         } else {                                          } else {
                                                 task->task_type = taskREADY;                                                  task->task_type = taskREADY;
   #ifdef HAVE_LIBPTHREAD
                                                   pthread_mutex_lock(&r->root_mtx[taskREADY]);
   #endif
                                                 TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);                                                  TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                                                   pthread_mutex_unlock(&r->root_mtx[taskREADY]);
   #endif
                                         }                                          }
                                         break;                                          break;
                                 }                                  }
Line 400  retry: Line 472  retry:
   
         TAILQ_FOREACH(task, &r->root_timer, task_node)          TAILQ_FOREACH(task, &r->root_timer, task_node)
                 if (timercmp(&now, &TASK_TV(task), -) >= 0) {                  if (timercmp(&now, &TASK_TV(task), -) >= 0) {
   #ifdef HAVE_LIBPTHREAD
                           pthread_mutex_lock(&r->root_mtx[taskTIMER]);
   #endif
                         TAILQ_REMOVE(&r->root_timer, task, task_node);                          TAILQ_REMOVE(&r->root_timer, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                           pthread_mutex_unlock(&r->root_mtx[taskTIMER]);
   #endif
                         task->task_type = taskREADY;                          task->task_type = taskREADY;
   #ifdef HAVE_LIBPTHREAD
                           pthread_mutex_lock(&r->root_mtx[taskREADY]);
   #endif
                         TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);                          TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                           pthread_mutex_unlock(&r->root_mtx[taskREADY]);
   #endif
                 }                  }
   
         /* put eventlo priority task to ready queue, if there is no ready task or           /* put eventlo priority task to ready queue, if there is no ready task or 
Line 411  retry: Line 495  retry:
                 if (!TAILQ_FIRST(&r->root_ready) || r->root_eventlo_miss > MAX_EVENTLO_MISS) {                  if (!TAILQ_FIRST(&r->root_ready) || r->root_eventlo_miss > MAX_EVENTLO_MISS) {
                         r->root_eventlo_miss = 0;                          r->root_eventlo_miss = 0;
   
   #ifdef HAVE_LIBPTHREAD
                           pthread_mutex_lock(&r->root_mtx[taskEVENTLO]);
   #endif
                         TAILQ_REMOVE(&r->root_eventlo, task, task_node);                          TAILQ_REMOVE(&r->root_eventlo, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                           pthread_mutex_unlock(&r->root_mtx[taskEVENTLO]);
   #endif
                         task->task_type = taskREADY;                          task->task_type = taskREADY;
   #ifdef HAVE_LIBPTHREAD
                           pthread_mutex_lock(&r->root_mtx[taskREADY]);
   #endif
                         TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);                          TAILQ_INSERT_TAIL(&r->root_ready, task, task_node);
   #ifdef HAVE_LIBPTHREAD
                           pthread_mutex_unlock(&r->root_mtx[taskREADY]);
   #endif
                 } else                  } else
                         r->root_eventlo_miss++;                          r->root_eventlo_miss++;
         } else          } else
Line 422  retry: Line 518  retry:
         /* OK, lets get ready task !!! */          /* OK, lets get ready task !!! */
         if (!(task = TAILQ_FIRST(&r->root_ready)))          if (!(task = TAILQ_FIRST(&r->root_ready)))
                 goto retry;                  goto retry;
   #ifdef HAVE_LIBPTHREAD
           pthread_mutex_lock(&r->root_mtx[taskREADY]);
   #endif
         TAILQ_REMOVE(&r->root_ready, task, task_node);          TAILQ_REMOVE(&r->root_ready, task, task_node);
   #ifdef HAVE_LIBPTHREAD
           pthread_mutex_unlock(&r->root_mtx[taskREADY]);
   #endif
         task->task_type = taskUNUSE;          task->task_type = taskUNUSE;
   #ifdef HAVE_LIBPTHREAD
           pthread_mutex_lock(&r->root_mtx[taskUNUSE]);
   #endif
         TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node);          TAILQ_INSERT_TAIL(&r->root_unuse, task, task_node);
   #ifdef HAVE_LIBPTHREAD
           pthread_mutex_unlock(&r->root_mtx[taskUNUSE]);
   #endif
         return task;          return task;
 }  }
   

Removed from v.1.3  
changed lines
  Added in v.1.3.4.1


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