Diff for /libaitsched/src/hooks.c between versions 1.37 and 1.42

version 1.37, 2022/10/19 01:45:08 version 1.42, 2023/08/17 14:14:24
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 - 2022Copyright 2004 - 2023
         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 47  SUCH DAMAGE. Line 47  SUCH DAMAGE.
 #include "hooks.h"  #include "hooks.h"
   
   
 static inline void  
 transit_task2ready(sched_task_t * __restrict t, sched_queue_t * __restrict q)  
 {  
         remove_task_from(t, q);  
   
         t->task_type = taskREADY;  
         insert_task_to(t, &(TASK_ROOT(t))->root_ready);  
 }  
   
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
 static void *  static void *
 _sched_threadWrapper(sched_task_t *t)  _sched_threadWrapper(sched_task_t *t)
Line 156  sched_hook_init(void *root, void *arg __unused) Line 147  sched_hook_init(void *root, void *arg __unused)
         }          }
 #else  #else
         r->root_kq ^= r->root_kq;          r->root_kq ^= r->root_kq;
   #endif
   
         FD_ZERO(&r->root_fds[0]);          FD_ZERO(&r->root_fds[0]);
         FD_ZERO(&r->root_fds[1]);          FD_ZERO(&r->root_fds[1]);
#endif        FD_ZERO(&r->root_fds[2]);
   
         return NULL;          return NULL;
 }  }
Line 184  sched_hook_fini(void *root, void *arg __unused) Line 177  sched_hook_fini(void *root, void *arg __unused)
                 r->root_kq = 0;                  r->root_kq = 0;
         }          }
 #else  #else
         FD_ZERO(&r->root_fds[1]);  
         FD_ZERO(&r->root_fds[0]);  
         r->root_kq ^= r->root_kq;          r->root_kq ^= r->root_kq;
 #endif  #endif
   
           FD_ZERO(&r->root_fds[2]);
           FD_ZERO(&r->root_fds[1]);
           FD_ZERO(&r->root_fds[0]);
   
         return NULL;          return NULL;
 }  }
   
Line 209  sched_hook_cancel(void *task, void *arg __unused) Line 204  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 };
 #elif SUP_ENABLE == EP_SUPPORT  #elif SUP_ENABLE == EP_SUPPORT
        struct epoll_event ee = { .events = 0, .data.fd = 0 };        struct epoll_event ee = { .events = 0, .data.u64 = 0l };
 #else  #else
         register int i;          register int i;
 #endif  #endif
Line 244  sched_hook_cancel(void *task, void *arg __unused) Line 239  sched_hook_cancel(void *task, void *arg __unused)
                         ee.data.fd = TASK_FD(t);                          ee.data.fd = TASK_FD(t);
                         ee.events ^= ee.events;                          ee.events ^= ee.events;
                         if (FD_ISSET(TASK_FD(t), &r->root_fds[1]))                          if (FD_ISSET(TASK_FD(t), &r->root_fds[1]))
                                ee.events = EPOLLOUT;                                ee.events |= EPOLLOUT;
   
                        if (flg < 2)                        if (flg < 2) {
                                 FD_CLR(TASK_FD(t), &r->root_fds[0]);                                  FD_CLR(TASK_FD(t), &r->root_fds[0]);
                        else                                FD_CLR(TASK_FD(t), &r->root_fds[2]);
                                ee.events |= EPOLLIN | EPOLLPRI;                        } else {
                                 if (FD_ISSET(TASK_FD(t), &r->root_fds[0]))
                                         ee.events |= EPOLLIN;
                                 if (FD_ISSET(TASK_FD(t), &r->root_fds[2]))
                                         ee.events |= EPOLLPRI;
                         }
 #else  #else
                         if (flg < 2) {                          if (flg < 2) {
                                 FD_CLR(TASK_FD(t), &r->root_fds[0]);                                  FD_CLR(TASK_FD(t), &r->root_fds[0]);
                                   FD_CLR(TASK_FD(t), &r->root_fds[2]);
   
                                 /* optimize select */                                  /* optimize select */
                                 for (i = r->root_kq - 1; i >= 0; i--)                                  for (i = r->root_kq - 1; i >= 0; i--)
                                        if (FD_ISSET(i, &r->root_fds[0]) || FD_ISSET(i, &r->root_fds[1]))                                        if (FD_ISSET(i, &r->root_fds[0]) || 
                                                         FD_ISSET(i, &r->root_fds[1]) || 
                                                         FD_ISSET(i, &r->root_fds[2]))
                                                 break;                                                  break;
                                 r->root_kq = i + 1;                                  r->root_kq = i + 1;
                         }                          }
Line 279  sched_hook_cancel(void *task, void *arg __unused) Line 282  sched_hook_cancel(void *task, void *arg __unused)
                         ee.data.fd = TASK_FD(t);                          ee.data.fd = TASK_FD(t);
                         ee.events ^= ee.events;                          ee.events ^= ee.events;
                         if (FD_ISSET(TASK_FD(t), &r->root_fds[0]))                          if (FD_ISSET(TASK_FD(t), &r->root_fds[0]))
                                ee.events = EPOLLIN | EPOLLPRI;                                ee.events |= EPOLLIN;
                         if (FD_ISSET(TASK_FD(t), &r->root_fds[2]))
                                 ee.events |= EPOLLPRI;
   
                         if (flg < 2)                          if (flg < 2)
                                 FD_CLR(TASK_FD(t), &r->root_fds[1]);                                  FD_CLR(TASK_FD(t), &r->root_fds[1]);
Line 291  sched_hook_cancel(void *task, void *arg __unused) Line 296  sched_hook_cancel(void *task, void *arg __unused)
   
                                 /* optimize select */                                  /* optimize select */
                                 for (i = r->root_kq - 1; i >= 0; i--)                                  for (i = r->root_kq - 1; i >= 0; i--)
                                        if (FD_ISSET(i, &r->root_fds[0]) || FD_ISSET(i, &r->root_fds[1]))                                        if (FD_ISSET(i, &r->root_fds[0]) || 
                                                         FD_ISSET(i, &r->root_fds[1]) || 
                                                         FD_ISSET(i, &r->root_fds[2]))
                                                 break;                                                  break;
                                 r->root_kq = i + 1;                                  r->root_kq = i + 1;
                         }                          }
Line 343  sched_hook_cancel(void *task, void *arg __unused) Line 350  sched_hook_cancel(void *task, void *arg __unused)
 #endif  #endif
                         break;                          break;
                 case taskSIGNAL:                  case taskSIGNAL:
 #if SUP_ENABLE == KQ_SUPPORT  
                         /* check for multi subscribers */                          /* check for multi subscribers */
                         TAILQ_FOREACH_SAFE(tt, &r->root_signal, task_node, tmp)                          TAILQ_FOREACH_SAFE(tt, &r->root_signal, task_node, tmp)
                                 if (TASK_VAL(tt) == TASK_VAL(t))                                  if (TASK_VAL(tt) == TASK_VAL(t))
                                         flg++;                                          flg++;
   #if SUP_ENABLE == KQ_SUPPORT
 #ifdef __NetBSD__  #ifdef __NetBSD__
                         EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, flg < 2 ? EV_DELETE : 0,                           EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, flg < 2 ? EV_DELETE : 0, 
                                         0, 0, (intptr_t) TASK_VAL(t));                                          0, 0, (intptr_t) TASK_VAL(t));
Line 355  sched_hook_cancel(void *task, void *arg __unused) Line 362  sched_hook_cancel(void *task, void *arg __unused)
                         EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, flg < 2 ? EV_DELETE : 0,                           EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, flg < 2 ? EV_DELETE : 0, 
                                         0, 0, (void*) TASK_VAL(t));                                          0, 0, (void*) TASK_VAL(t));
 #endif  #endif
                         /* restore signal */  
                         if (flg < 2)  
                                 signal(TASK_VAL(t), SIG_DFL);  
 #endif  #endif
                           if (flg < 2) {
                                   pthread_mutex_lock(&TASK_ROOT(t)->root_sigmtx);
                                   sigdelset(&TASK_ROOT(t)->root_sigset, TASK_VAL(t));
                                   pthread_mutex_unlock(&TASK_ROOT(t)->root_sigmtx);
                           }
                         break;                          break;
 #ifdef AIO_SUPPORT  #ifdef AIO_SUPPORT
                 case taskAIO:                  case taskAIO:
Line 517  sched_hook_thread(void *task, void *arg) Line 526  sched_hook_thread(void *task, void *arg)
  * return: <0 errors and 0 ok   * return: <0 errors and 0 ok
  */   */
 void *  void *
sched_hook_read(void *task, void *arg __unused)sched_hook_read(void *task, void *arg)
 {  {
         sched_task_t *t = task;          sched_task_t *t = task;
         sched_root_task_t *r = NULL;          sched_root_task_t *r = NULL;
           uintptr_t mask = (uintptr_t) arg;
 #if SUP_ENABLE == KQ_SUPPORT  #if SUP_ENABLE == KQ_SUPPORT
         struct kevent chg[1];          struct kevent chg[1];
         struct timespec timeout = { 0, 0 };          struct timespec timeout = { 0, 0 };
 #elif SUP_ENABLE == EP_SUPPORT  #elif SUP_ENABLE == EP_SUPPORT
        struct epoll_event ee;        struct epoll_event ee = { 0 };
         int flg = 0;          int flg = 0;
 #endif  #endif
   
Line 536  sched_hook_read(void *task, void *arg __unused) Line 546  sched_hook_read(void *task, void *arg __unused)
   
 #if SUP_ENABLE == KQ_SUPPORT  #if SUP_ENABLE == KQ_SUPPORT
 #ifdef __NetBSD__  #ifdef __NetBSD__
        EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, (intptr_t) TASK_FD(t));        EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD | EV_CLEAR | mask, 
                         0, 0, (intptr_t) TASK_FD(t));
 #else  #else
        EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, (void*) TASK_FD(t));        EV_SET(&chg[0], TASK_FD(t), EVFILT_READ, EV_ADD | EV_CLEAR | mask, 
                         0, 0, (void*) TASK_FD(t));
 #endif  #endif
         if (kevent(r->root_kq, chg, 1, NULL, 0, &timeout) == -1) {          if (kevent(r->root_kq, chg, 1, NULL, 0, &timeout) == -1) {
                 if (r->root_hooks.hook_exec.exception)                  if (r->root_hooks.hook_exec.exception)
Line 548  sched_hook_read(void *task, void *arg __unused) Line 560  sched_hook_read(void *task, void *arg __unused)
                 return (void*) -1;                  return (void*) -1;
         }          }
 #elif SUP_ENABLE == EP_SUPPORT  #elif SUP_ENABLE == EP_SUPPORT
           if (!mask)
                   mask = EPOLLIN | EPOLLPRI;
         ee.data.fd = TASK_FD(t);          ee.data.fd = TASK_FD(t);
        ee.events = EPOLLIN | EPOLLPRI;        ee.events = mask;
        if (FD_ISSET(TASK_FD(t), &r->root_fds[0]))        if (FD_ISSET(TASK_FD(t), &r->root_fds[2])) {
                 flg |= 4;
                 ee.events |= EPOLLPRI;
         }
         if (FD_ISSET(TASK_FD(t), &r->root_fds[0])) {
                 flg |= 1;                  flg |= 1;
                   ee.events |= EPOLLIN;
           }
         if (FD_ISSET(TASK_FD(t), &r->root_fds[1])) {          if (FD_ISSET(TASK_FD(t), &r->root_fds[1])) {
                 flg |= 2;                  flg |= 2;
                 ee.events |= EPOLLOUT;                  ee.events |= EPOLLOUT;
Line 563  sched_hook_read(void *task, void *arg __unused) Line 583  sched_hook_read(void *task, void *arg __unused)
                 else                  else
                         LOGERR;                          LOGERR;
                 return (void*) -1;                  return (void*) -1;
        } else        } else {
                FD_SET(TASK_FD(t), &r->root_fds[0]);                if (mask & EPOLLIN)
                         FD_SET(TASK_FD(t), &r->root_fds[0]);
                 if (mask & EPOLLPRI)
                         FD_SET(TASK_FD(t), &r->root_fds[2]);
         }
 #else  #else
        FD_SET(TASK_FD(t), &r->root_fds[0]);        if (!mask) {
                 FD_SET(TASK_FD(t), &r->root_fds[0]);
                 FD_SET(TASK_FD(t), &r->root_fds[2]);
         } else {
                 if (mask & 1)
                         FD_SET(TASK_FD(t), &r->root_fds[0]);
                 if (mask & 2)
                         FD_SET(TASK_FD(t), &r->root_fds[2]);
         }
 
         if (TASK_FD(t) >= r->root_kq)          if (TASK_FD(t) >= r->root_kq)
                 r->root_kq = TASK_FD(t) + 1;                  r->root_kq = TASK_FD(t) + 1;
 #endif  #endif
Line 582  sched_hook_read(void *task, void *arg __unused) Line 615  sched_hook_read(void *task, void *arg __unused)
  * return: <0 errors and 0 ok   * return: <0 errors and 0 ok
  */   */
 void *  void *
sched_hook_write(void *task, void *arg __unused)sched_hook_write(void *task, void *arg)
 {  {
         sched_task_t *t = task;          sched_task_t *t = task;
         sched_root_task_t *r = NULL;          sched_root_task_t *r = NULL;
           uintptr_t mask = (uintptr_t) arg;
 #if SUP_ENABLE == KQ_SUPPORT  #if SUP_ENABLE == KQ_SUPPORT
         struct kevent chg[1];          struct kevent chg[1];
         struct timespec timeout = { 0, 0 };          struct timespec timeout = { 0, 0 };
 #elif SUP_ENABLE == EP_SUPPORT  #elif SUP_ENABLE == EP_SUPPORT
        struct epoll_event ee;        struct epoll_event ee = { 0 };
         int flg = 0;          int flg = 0;
 #endif  #endif
   
Line 601  sched_hook_write(void *task, void *arg __unused) Line 635  sched_hook_write(void *task, void *arg __unused)
   
 #if SUP_ENABLE == KQ_SUPPORT  #if SUP_ENABLE == KQ_SUPPORT
 #ifdef __NetBSD__  #ifdef __NetBSD__
        EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD | EV_CLEAR, 0, 0, (intptr_t) TASK_FD(t));        EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD | EV_CLEAR | mask, 
                         0, 0, (intptr_t) TASK_FD(t));
 #else  #else
        EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD | EV_CLEAR, 0, 0, (void*) TASK_FD(t));        EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD | EV_CLEAR | mask, 
                         0, 0, (void*) TASK_FD(t));
 #endif  #endif
         if (kevent(r->root_kq, chg, 1, NULL, 0, &timeout) == -1) {          if (kevent(r->root_kq, chg, 1, NULL, 0, &timeout) == -1) {
                 if (r->root_hooks.hook_exec.exception)                  if (r->root_hooks.hook_exec.exception)
Line 613  sched_hook_write(void *task, void *arg __unused) Line 649  sched_hook_write(void *task, void *arg __unused)
                 return (void*) -1;                  return (void*) -1;
         }          }
 #elif SUP_ENABLE == EP_SUPPORT  #elif SUP_ENABLE == EP_SUPPORT
           if (!mask)
                   mask = EPOLLOUT;
         ee.data.fd = TASK_FD(t);          ee.data.fd = TASK_FD(t);
        ee.events = EPOLLOUT;        ee.events = mask;
   
           if (FD_ISSET(TASK_FD(t), &r->root_fds[2])) {
                   flg |= 4;
                   ee.events |= EPOLLPRI;
           }
         if (FD_ISSET(TASK_FD(t), &r->root_fds[0])) {          if (FD_ISSET(TASK_FD(t), &r->root_fds[0])) {
                 flg |= 1;                  flg |= 1;
                ee.events |= EPOLLIN | EPOLLPRI;                ee.events |= EPOLLIN;
         }          }
         if (FD_ISSET(TASK_FD(t), &r->root_fds[1])) {          if (FD_ISSET(TASK_FD(t), &r->root_fds[1])) {
                 flg |= 2;                  flg |= 2;
                   ee.events |= EPOLLOUT;
         }          }
   
         if (epoll_ctl(r->root_kq, flg ? EPOLL_CTL_MOD : EPOLL_CTL_ADD, TASK_FD(t), &ee) == -1) {          if (epoll_ctl(r->root_kq, flg ? EPOLL_CTL_MOD : EPOLL_CTL_ADD, TASK_FD(t), &ee) == -1) {
Line 631  sched_hook_write(void *task, void *arg __unused) Line 674  sched_hook_write(void *task, void *arg __unused)
                         LOGERR;                          LOGERR;
                 return (void*) -1;                  return (void*) -1;
         } else          } else
                FD_SET(TASK_FD(t), &r->root_fds[1]);                if (mask & EPOLLOUT)
                         FD_SET(TASK_FD(t), &r->root_fds[1]);
 #else  #else
        FD_SET(TASK_FD(t), &r->root_fds[1]);        if (!mask)
                 FD_SET(TASK_FD(t), &r->root_fds[1]);
         else
                 if (mask & 1)
                         FD_SET(TASK_FD(t), &r->root_fds[1]);
 
         if (TASK_FD(t) >= r->root_kq)          if (TASK_FD(t) >= r->root_kq)
                 r->root_kq = TASK_FD(t) + 1;                  r->root_kq = TASK_FD(t) + 1;
 #endif  #endif
Line 767  sched_hook_proc(void *task, void *arg __unused) Line 816  sched_hook_proc(void *task, void *arg __unused)
 void *  void *
 sched_hook_signal(void *task, void *arg __unused)  sched_hook_signal(void *task, void *arg __unused)
 {  {
 #if SUP_ENABLE == KQ_SUPPORT  
         sched_task_t *t = task;          sched_task_t *t = task;
   #if SUP_ENABLE == KQ_SUPPORT
         struct kevent chg[1];          struct kevent chg[1];
         struct timespec timeout = { 0, 0 };          struct timespec timeout = { 0, 0 };
   #endif
   
         if (!t || !TASK_ROOT(t))          if (!t || !TASK_ROOT(t))
                 return (void*) -1;                  return (void*) -1;
   
        /* ignore signal */#if SUP_ENABLE == KQ_SUPPORT
        signal(TASK_VAL(t), SIG_IGN); 
 
 #ifdef __NetBSD__  #ifdef __NetBSD__
         EV_SET(&chg[0], TASK_VAL(t), EVFILT_SIGNAL, EV_ADD | EV_CLEAR, 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
Line 791  sched_hook_signal(void *task, void *arg __unused) Line 839  sched_hook_signal(void *task, void *arg __unused)
                 return (void*) -1;                  return (void*) -1;
         }          }
 #endif  #endif
   
           pthread_mutex_lock(&TASK_ROOT(t)->root_sigmtx);
           sigaddset(&TASK_ROOT(t)->root_sigset, TASK_VAL(t));
           pthread_mutex_unlock(&TASK_ROOT(t)->root_sigmtx);
   
         return NULL;          return NULL;
 }  }
   
Line 1107  fetch_hook_epoll_proceed(int en, struct epoll_event *r Line 1160  fetch_hook_epoll_proceed(int en, struct epoll_event *r
                                         evt->events |= EPOLLOUT;                                          evt->events |= EPOLLOUT;
                                         wflg = 42;                                          wflg = 42;
                                 }                                  }
                                if (rflg > 1)                                if (rflg > 1) {
                                        evt->events |= EPOLLIN | EPOLLPRI;                                        if (FD_ISSET(evt->data.fd, &r->root_fds[0]))
                                else                                                evt->events |= EPOLLIN;
                                         if (FD_ISSET(evt->data.fd, &r->root_fds[2]))
                                                 evt->events |= EPOLLPRI;
                                 } else {
                                         FD_CLR(evt->data.fd, &r->root_fds[0]);                                          FD_CLR(evt->data.fd, &r->root_fds[0]);
                                           FD_CLR(evt->data.fd, &r->root_fds[2]);
                                   }
                         }                          }
                 }                  }
                 if (res[i].events & EPOLLOUT) {                  if (res[i].events & EPOLLOUT) {
Line 1142  fetch_hook_epoll_proceed(int en, struct epoll_event *r Line 1200  fetch_hook_epoll_proceed(int en, struct epoll_event *r
                                         insert_task_to(task, &r->root_ready);                                          insert_task_to(task, &r->root_ready);
                                 }                                  }
   
                                if (!(res[i].events & (EPOLLIN | EPOLLPRI)) && FD_ISSET(evt->data.fd, &r->root_fds[0])) {                                if (!(res[i].events & EPOLLIN) && FD_ISSET(evt->data.fd, &r->root_fds[0])) {
                                        evt->events |= EPOLLIN | EPOLLPRI;                                        evt->events |= EPOLLIN;
                                         rflg = 42;                                          rflg = 42;
                                 }                                  }
                                   if (!(res[i].events & EPOLLPRI) && FD_ISSET(evt->data.fd, &r->root_fds[2])) {
                                           evt->events |= EPOLLPRI;
                                           rflg = 42;
                                   }
                                 if (wflg > 1)                                  if (wflg > 1)
                                         evt->events |= EPOLLOUT;                                          evt->events |= EPOLLOUT;
                                 else                                  else
Line 1153  fetch_hook_epoll_proceed(int en, struct epoll_event *r Line 1215  fetch_hook_epoll_proceed(int en, struct epoll_event *r
                         }                          }
                 }                  }
   
                   ops = EPOLL_CTL_DEL;
                 if (rflg > 1 || wflg > 1)                  if (rflg > 1 || wflg > 1)
                         ops = EPOLL_CTL_MOD;                          ops = EPOLL_CTL_MOD;
   
Line 1178  fetch_hook_select_proceed(int en, fd_set rfd, fd_set w Line 1241  fetch_hook_select_proceed(int en, fd_set rfd, fd_set w
                 return;                  return;
   
         for (i = 0; i < r->root_kq; i++) {          for (i = 0; i < r->root_kq; i++) {
                if (!FD_ISSET(i, &r->root_fds[0]) && !FD_ISSET(i, &r->root_fds[1]))                if (!FD_ISSET(i, &r->root_fds[0]) && 
                                 !FD_ISSET(i, &r->root_fds[1]) && 
                                 !FD_ISSET(i, &r->root_fds[2]))
                         continue;                          continue;
   
                 rflg = wflg = 0;                  rflg = wflg = 0;
Line 1213  fetch_hook_select_proceed(int en, fd_set rfd, fd_set w Line 1278  fetch_hook_select_proceed(int en, fd_set rfd, fd_set w
                                 }                                  }
   
                                 /* remove resouce */                                  /* remove resouce */
                                if (rflg == 1)                                if (rflg == 1) {
                                         FD_CLR(i, &r->root_fds[0]);                                          FD_CLR(i, &r->root_fds[0]);
                                           FD_CLR(i, &r->root_fds[2]);
                                   }
                         }                          }
                 }                  }
                 if (FD_ISSET(i, &wfd)) {                  if (FD_ISSET(i, &wfd)) {
Line 1255  fetch_hook_select_proceed(int en, fd_set rfd, fd_set w Line 1322  fetch_hook_select_proceed(int en, fd_set rfd, fd_set w
   
         /* optimize select */          /* optimize select */
         for (i = r->root_kq - 1; i >= 0; i--)          for (i = r->root_kq - 1; i >= 0; i--)
                if (FD_ISSET(i, &r->root_fds[0]) || FD_ISSET(i, &r->root_fds[1]))                if (FD_ISSET(i, &r->root_fds[0]) || 
                                 FD_ISSET(i, &r->root_fds[1]) || 
                                 FD_ISSET(i, &r->root_fds[2]))
                         break;                          break;
         r->root_kq = i + 1;          r->root_kq = i + 1;
 }  }
Line 1273  sched_hook_fetch(void *root, void *arg __unused) Line 1342  sched_hook_fetch(void *root, void *arg __unused)
 {  {
         sched_root_task_t *r = root;          sched_root_task_t *r = root;
         sched_task_t *task, *tmp;          sched_task_t *task, *tmp;
        struct timespec now, m, mtmp;        struct timespec now, m, mtmp, *tsmin;
 #if SUP_ENABLE == KQ_SUPPORT  #if SUP_ENABLE == KQ_SUPPORT
         struct kevent res[KQ_EVENTS];          struct kevent res[KQ_EVENTS];
         struct timespec *timeout;          struct timespec *timeout;
Line 1316  sched_hook_fetch(void *root, void *arg __unused) Line 1385  sched_hook_fetch(void *root, void *arg __unused)
                 if (TAILQ_FIRST(&r->root_timer)) {                  if (TAILQ_FIRST(&r->root_timer)) {
                         m = r->root_wait;                          m = r->root_wait;
                         sched_timespecsub(&m, &now, &mtmp);                          sched_timespecsub(&m, &now, &mtmp);
                        r->root_wait = mtmp;                        if (mtmp.tv_sec < 0 || mtmp.tv_nsec < 0)
                                 /* don't wait for events. we have ready timer */
                                 sched_timespecclear(&r->root_wait);
                         else
                                 r->root_wait = mtmp;
                 } else {                  } else {
                         /* set wait INFTIM */                          /* set wait INFTIM */
                         sched_timespecinf(&r->root_wait);                          sched_timespecinf(&r->root_wait);
Line 1327  sched_hook_fetch(void *root, void *arg __unused) Line 1400  sched_hook_fetch(void *root, void *arg __unused)
   
                         m = TASK_TS(task);                          m = TASK_TS(task);
                         sched_timespecsub(&m, &now, &mtmp);                          sched_timespecsub(&m, &now, &mtmp);
                        r->root_wait = mtmp;                        if (mtmp.tv_sec < 0 || mtmp.tv_nsec < 0)
                                 /* don't wait for events. we have ready timer */
                                 sched_timespecclear(&r->root_wait);
                         else
                                 r->root_wait = mtmp;
                 } else {                  } else {
                         /* set wait INFTIM */                          /* set wait INFTIM */
                         sched_timespecinf(&r->root_wait);                          sched_timespecinf(&r->root_wait);
Line 1336  sched_hook_fetch(void *root, void *arg __unused) Line 1413  sched_hook_fetch(void *root, void *arg __unused)
         } else  /* no waiting for event, because we have ready task */          } else  /* no waiting for event, because we have ready task */
                 sched_timespecclear(&r->root_wait);                  sched_timespecclear(&r->root_wait);
   
        if (r->root_wait.tv_sec != -1 && r->root_wait.tv_nsec != -1) {        if (!sched_timespecisinf(&r->root_wait)) {
                 tsmin = sched_timespecmin(&r->root_wait, &r->root_poll);
 #if SUP_ENABLE == KQ_SUPPORT  #if SUP_ENABLE == KQ_SUPPORT
                timeout = &r->root_wait;                timeout = tsmin;
 #elif SUP_ENABLE == EP_SUPPORT  #elif SUP_ENABLE == EP_SUPPORT
                timeout = r->root_wait.tv_sec * 1000 + r->root_wait.tv_nsec / 1000000;                timeout = tsmin->tv_sec * 1000 + tsmin->tv_nsec / 1000000;
 #else  #else
                sched_timespec2val(&r->root_wait, &tv);                sched_timespec2val(tsmin, &tv);
                 timeout = &tv;                  timeout = &tv;
 #endif  /* KQ_SUPPORT */  #endif  /* KQ_SUPPORT */
         } else if (sched_timespecisinf(&r->root_poll))          } else if (sched_timespecisinf(&r->root_poll))
Line 1367  sched_hook_fetch(void *root, void *arg __unused) Line 1445  sched_hook_fetch(void *root, void *arg __unused)
 #elif SUP_ENABLE == EP_SUPPORT  #elif SUP_ENABLE == EP_SUPPORT
         if ((en = epoll_wait(r->root_kq, res, KQ_EVENTS, timeout)) == -1) {          if ((en = epoll_wait(r->root_kq, res, KQ_EVENTS, timeout)) == -1) {
 #else  #else
        rfd = xfd = r->root_fds[0];        xfd = r->root_fds[2];
         rfd = r->root_fds[0];
         wfd = r->root_fds[1];          wfd = r->root_fds[1];
         if ((en = select(r->root_kq, &rfd, &wfd, &xfd, timeout)) == -1) {          if ((en = select(r->root_kq, &rfd, &wfd, &xfd, timeout)) == -1) {
 #endif  /* KQ_SUPPORT */  #endif  /* KQ_SUPPORT */

Removed from v.1.37  
changed lines
  Added in v.1.42


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