Diff for /libaitsched/src/tasks.c between versions 1.8.2.1 and 1.10.2.4

version 1.8.2.1, 2012/05/31 14:17:59 version 1.10.2.4, 2012/08/01 16:47:06
Line 74  _sched_useTask(sched_root_task_t * __restrict root) Line 74  _sched_useTask(sched_root_task_t * __restrict root)
                 }                  }
         }          }
   
           memset(task, 0, sizeof(sched_task_t));
           task->task_id = (uintptr_t) task;
         return task;          return task;
 }  }
   
Line 85  _sched_unuseTask(sched_task_t * __restrict task) Line 87  _sched_unuseTask(sched_task_t * __restrict task)
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
         pthread_mutex_lock(&TASK_ROOT(task)->root_mtx[taskUNUSE]);          pthread_mutex_lock(&TASK_ROOT(task)->root_mtx[taskUNUSE]);
 #endif  #endif
        TAILQ_INSERT_TAIL(&TASK_ROOT(task)->root_unuse, task, task_node);        TAILQ_INSERT_TAIL(&TASK_ROOT(task)->root_unuse, TASK_ID(task), task_node);
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
         pthread_mutex_unlock(&TASK_ROOT(task)->root_mtx[taskUNUSE]);          pthread_mutex_unlock(&TASK_ROOT(task)->root_mtx[taskUNUSE]);
 #endif  #endif
Line 122  schedRead(sched_root_task_t * __restrict root, sched_t Line 124  schedRead(sched_root_task_t * __restrict root, sched_t
         if (!(task = _sched_useTask(root)))          if (!(task = _sched_useTask(root)))
                 return NULL;                  return NULL;
   
         memset(task, 0, sizeof(sched_task_t));  
         task->task_id = 0;  
         task->task_lock = 0;  
         task->task_func = func;          task->task_func = func;
         TASK_TYPE(task) = taskREAD;          TASK_TYPE(task) = taskREAD;
         TASK_ROOT(task) = root;          TASK_ROOT(task) = root;
Line 144  schedRead(sched_root_task_t * __restrict root, sched_t Line 143  schedRead(sched_root_task_t * __restrict root, sched_t
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_lock(&root->root_mtx[taskREAD]);                  pthread_mutex_lock(&root->root_mtx[taskREAD]);
 #endif  #endif
                TAILQ_INSERT_TAIL(&root->root_read, task, task_node);                TAILQ_INSERT_TAIL(&root->root_read, TASK_ID(task), task_node);
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_unlock(&root->root_mtx[taskREAD]);                  pthread_mutex_unlock(&root->root_mtx[taskREAD]);
 #endif  #endif
Line 179  schedWrite(sched_root_task_t * __restrict root, sched_ Line 178  schedWrite(sched_root_task_t * __restrict root, sched_
         if (!(task = _sched_useTask(root)))          if (!(task = _sched_useTask(root)))
                 return NULL;                  return NULL;
   
         memset(task, 0, sizeof(sched_task_t));  
         task->task_id = 0;  
         task->task_lock = 0;  
         task->task_func = func;          task->task_func = func;
         TASK_TYPE(task) = taskWRITE;          TASK_TYPE(task) = taskWRITE;
         TASK_ROOT(task) = root;          TASK_ROOT(task) = root;
Line 201  schedWrite(sched_root_task_t * __restrict root, sched_ Line 197  schedWrite(sched_root_task_t * __restrict root, sched_
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_lock(&root->root_mtx[taskWRITE]);                  pthread_mutex_lock(&root->root_mtx[taskWRITE]);
 #endif  #endif
                TAILQ_INSERT_TAIL(&root->root_write, task, task_node);                TAILQ_INSERT_TAIL(&root->root_write, TASK_ID(task), task_node);
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_unlock(&root->root_mtx[taskWRITE]);                  pthread_mutex_unlock(&root->root_mtx[taskWRITE]);
 #endif  #endif
Line 236  schedNode(sched_root_task_t * __restrict root, sched_t Line 232  schedNode(sched_root_task_t * __restrict root, sched_t
         if (!(task = _sched_useTask(root)))          if (!(task = _sched_useTask(root)))
                 return NULL;                  return NULL;
   
         memset(task, 0, sizeof(sched_task_t));  
         task->task_id = 0;  
         task->task_lock = 0;  
         task->task_func = func;          task->task_func = func;
         TASK_TYPE(task) = taskNODE;          TASK_TYPE(task) = taskNODE;
         TASK_ROOT(task) = root;          TASK_ROOT(task) = root;
Line 258  schedNode(sched_root_task_t * __restrict root, sched_t Line 251  schedNode(sched_root_task_t * __restrict root, sched_t
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_lock(&root->root_mtx[taskNODE]);                  pthread_mutex_lock(&root->root_mtx[taskNODE]);
 #endif  #endif
                TAILQ_INSERT_TAIL(&root->root_node, task, task_node);                TAILQ_INSERT_TAIL(&root->root_node, TASK_ID(task), task_node);
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_unlock(&root->root_mtx[taskNODE]);                  pthread_mutex_unlock(&root->root_mtx[taskNODE]);
 #endif  #endif
Line 293  schedProc(sched_root_task_t * __restrict root, sched_t Line 286  schedProc(sched_root_task_t * __restrict root, sched_t
         if (!(task = _sched_useTask(root)))          if (!(task = _sched_useTask(root)))
                 return NULL;                  return NULL;
   
         memset(task, 0, sizeof(sched_task_t));  
         task->task_id = 0;  
         task->task_lock = 0;  
         task->task_func = func;          task->task_func = func;
         TASK_TYPE(task) = taskPROC;          TASK_TYPE(task) = taskPROC;
         TASK_ROOT(task) = root;          TASK_ROOT(task) = root;
Line 315  schedProc(sched_root_task_t * __restrict root, sched_t Line 305  schedProc(sched_root_task_t * __restrict root, sched_t
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_lock(&root->root_mtx[taskPROC]);                  pthread_mutex_lock(&root->root_mtx[taskPROC]);
 #endif  #endif
                TAILQ_INSERT_TAIL(&root->root_proc, task, task_node);                TAILQ_INSERT_TAIL(&root->root_proc, TASK_ID(task), task_node);
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_unlock(&root->root_mtx[taskPROC]);                  pthread_mutex_unlock(&root->root_mtx[taskPROC]);
 #endif  #endif
Line 333  schedProc(sched_root_task_t * __restrict root, sched_t Line 323  schedProc(sched_root_task_t * __restrict root, sched_t
  * @arg = 1st func argument   * @arg = 1st func argument
  * @id = Trigger ID   * @id = Trigger ID
  * @opt_data = Optional data   * @opt_data = Optional data
 * @opt_dlen = Optional data length * @opt_dlen = Optional user's trigger flags
  * return: NULL error or !=NULL new queued task   * return: NULL error or !=NULL new queued task
  */   */
 sched_task_t *  sched_task_t *
 schedUser(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, u_long id,   schedUser(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, u_long id, 
                 void *opt_data, size_t opt_dlen)                  void *opt_data, size_t opt_dlen)
 {  {
   #ifndef EVFILT_USER
           sched_SetErr(ENOTSUP, "Not supported kevent() filter");
           return NULL;
   #else
         sched_task_t *task;          sched_task_t *task;
         void *ptr;          void *ptr;
   
Line 350  schedUser(sched_root_task_t * __restrict root, sched_t Line 344  schedUser(sched_root_task_t * __restrict root, sched_t
         if (!(task = _sched_useTask(root)))          if (!(task = _sched_useTask(root)))
                 return NULL;                  return NULL;
   
         memset(task, 0, sizeof(sched_task_t));  
         task->task_id = 0;  
         task->task_lock = 0;  
         task->task_func = func;          task->task_func = func;
         TASK_TYPE(task) = taskUSER;          TASK_TYPE(task) = taskUSER;
         TASK_ROOT(task) = root;          TASK_ROOT(task) = root;
Line 372  schedUser(sched_root_task_t * __restrict root, sched_t Line 363  schedUser(sched_root_task_t * __restrict root, sched_t
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_lock(&root->root_mtx[taskUSER]);                  pthread_mutex_lock(&root->root_mtx[taskUSER]);
 #endif  #endif
                TAILQ_INSERT_TAIL(&root->root_user, task, task_node);                TAILQ_INSERT_TAIL(&root->root_user, TASK_ID(task), task_node);
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_unlock(&root->root_mtx[taskUSER]);                  pthread_mutex_unlock(&root->root_mtx[taskUSER]);
 #endif  #endif
Line 380  schedUser(sched_root_task_t * __restrict root, sched_t Line 371  schedUser(sched_root_task_t * __restrict root, sched_t
                 task = _sched_unuseTask(task);                  task = _sched_unuseTask(task);
   
         return task;          return task;
   #endif
 }  }
   
 /*  /*
Line 407  schedSignal(sched_root_task_t * __restrict root, sched Line 399  schedSignal(sched_root_task_t * __restrict root, sched
         if (!(task = _sched_useTask(root)))          if (!(task = _sched_useTask(root)))
                 return NULL;                  return NULL;
   
         memset(task, 0, sizeof(sched_task_t));  
         task->task_id = 0;  
         task->task_lock = 0;  
         task->task_func = func;          task->task_func = func;
         TASK_TYPE(task) = taskSIGNAL;          TASK_TYPE(task) = taskSIGNAL;
         TASK_ROOT(task) = root;          TASK_ROOT(task) = root;
Line 429  schedSignal(sched_root_task_t * __restrict root, sched Line 418  schedSignal(sched_root_task_t * __restrict root, sched
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_lock(&root->root_mtx[taskSIGNAL]);                  pthread_mutex_lock(&root->root_mtx[taskSIGNAL]);
 #endif  #endif
                TAILQ_INSERT_TAIL(&root->root_signal, task, task_node);                TAILQ_INSERT_TAIL(&root->root_signal, TASK_ID(task), task_node);
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_unlock(&root->root_mtx[taskSIGNAL]);                  pthread_mutex_unlock(&root->root_mtx[taskSIGNAL]);
 #endif  #endif
Line 464  schedAlarm(sched_root_task_t * __restrict root, sched_ Line 453  schedAlarm(sched_root_task_t * __restrict root, sched_
         if (!(task = _sched_useTask(root)))          if (!(task = _sched_useTask(root)))
                 return NULL;                  return NULL;
   
         memset(task, 0, sizeof(sched_task_t));  
         task->task_id = 0;  
         task->task_lock = 0;  
         task->task_func = func;          task->task_func = func;
         TASK_TYPE(task) = taskALARM;          TASK_TYPE(task) = taskALARM;
         TASK_ROOT(task) = root;          TASK_ROOT(task) = root;
Line 486  schedAlarm(sched_root_task_t * __restrict root, sched_ Line 472  schedAlarm(sched_root_task_t * __restrict root, sched_
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_lock(&root->root_mtx[taskALARM]);                  pthread_mutex_lock(&root->root_mtx[taskALARM]);
 #endif  #endif
                TAILQ_INSERT_TAIL(&root->root_alarm, task, task_node);                TAILQ_INSERT_TAIL(&root->root_alarm, TASK_ID(task), task_node);
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_unlock(&root->root_mtx[taskALARM]);                  pthread_mutex_unlock(&root->root_mtx[taskALARM]);
 #endif  #endif
Line 497  schedAlarm(sched_root_task_t * __restrict root, sched_ Line 483  schedAlarm(sched_root_task_t * __restrict root, sched_
 }  }
   
 /*  /*
    * schedAIO() - Add AIO task to scheduler queue
    *
    * @root = root task
    * @func = task execution function
    * @arg = 1st func argument
    * @acb = AIO cb structure address
    * @opt_data = Optional data
    * @opt_dlen = Optional data length
    * return: NULL error or !=NULL new queued task
    */
   sched_task_t *
   schedAIO(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, 
                   struct aiocb * __restrict acb, void *opt_data, size_t opt_dlen)
   {
   #ifndef EVFILT_AIO
           sched_SetErr(ENOTSUP, "Not supported kevent() filter");
           return NULL;
   #else
           sched_task_t *task;
           void *ptr;
   
           if (!root || !func)
                   return NULL;
   
           /* get new task */
           if (!(task = _sched_useTask(root)))
                   return NULL;
   
           task->task_func = func;
           TASK_TYPE(task) = taskAIO;
           TASK_ROOT(task) = root;
   
           TASK_ARG(task) = arg;
           TASK_VAL(task) = (u_long) acb;
   
           TASK_DATA(task) = opt_data;
           TASK_DATLEN(task) = opt_dlen;
   
           if (root->root_hooks.hook_add.aio)
                   ptr = root->root_hooks.hook_add.aio(task, NULL);
           else
                   ptr = NULL;
   
           if (!ptr) {
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_lock(&root->root_mtx[taskAIO]);
   #endif
                   TAILQ_INSERT_TAIL(&root->root_aio, TASK_ID(task), task_node);
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_unlock(&root->root_mtx[taskAIO]);
   #endif
           } else
                   task = _sched_unuseTask(task);
   
           return task;
   #endif
   }
   
   /*
    * schedAIORead() - Add AIO read task to scheduler queue
    *
    * @root = root task
    * @func = task execution function
    * @arg = 1st func argument
    * @fd = file descriptor
    * @buffer = Buffer
    * @buflen = Buffer length
    * return: NULL error or !=NULL new queued task
    */
   inline sched_task_t *
   schedAIORead(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd, 
                   void *buffer, size_t buflen)
   {
   #ifndef EVFILT_AIO
           sched_SetErr(ENOTSUP, "Not supported kevent() filter");
           return NULL;
   #else
           struct aiocb *acb;
           off_t off = 0;
   
           if (!root || !func)
                   return NULL;
           else
                   memset(buffer, 0, buflen);
   
           if (!(acb = malloc(sizeof(struct aiocb)))) {
                   LOGERR;
                   return NULL;
           } else
                   memset(acb, 0, sizeof(struct aiocb));
   
           acb->aio_fildes = fd;
           acb->aio_nbytes = buflen;
           acb->aio_buf = buffer;
           off = lseek(fd, 0, SEEK_CUR);
           if (off == -1) {
                   LOGERR;
                   free(acb);
                   return NULL;
           } else
                   acb->aio_offset = off;
           acb->aio_sigevent.sigev_notify = SIGEV_KEVENT;
           acb->aio_sigevent.sigev_notify_kqueue = root->root_kq;
           acb->aio_sigevent.sigev_value.sival_ptr = acb;
   
           if (aio_read(acb)) {
                   LOGERR;
                   free(acb);
                   return NULL;
           }
   
           return schedAIO(root, func, arg, acb, buffer, buflen);
   #endif
   }
   
   /*
    * schedAIOWrite() - Add AIO write task to scheduler queue
    *
    * @root = root task
    * @func = task execution function
    * @arg = 1st func argument
    * @fd = file descriptor
    * @buffer = Buffer
    * @buflen = Buffer length
    * return: NULL error or !=NULL new queued task
    */
   inline sched_task_t *
   schedAIOWrite(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd, 
                   void *buffer, size_t buflen)
   {
   #ifndef EVFILT_AIO
           sched_SetErr(ENOTSUP, "Not supported kevent() filter");
           return NULL;
   #else
           struct aiocb *acb;
           off_t off = 0;
   
           if (!root || !func)
                   return NULL;
           else
                   memset(buffer, 0, buflen);
   
           if (!(acb = malloc(sizeof(struct aiocb)))) {
                   LOGERR;
                   return NULL;
           } else
                   memset(acb, 0, sizeof(struct aiocb));
   
           acb->aio_fildes = fd;
           acb->aio_nbytes = buflen;
           acb->aio_buf = buffer;
           off = lseek(fd, 0, SEEK_CUR);
           if (off == -1) {
                   LOGERR;
                   free(acb);
                   return NULL;
           } else
                   acb->aio_offset = off;
           acb->aio_sigevent.sigev_notify = SIGEV_KEVENT;
           acb->aio_sigevent.sigev_notify_kqueue = root->root_kq;
           acb->aio_sigevent.sigev_value.sival_ptr = acb;
   
           if (aio_write(acb)) {
                   LOGERR;
                   free(acb);
                   return NULL;
           }
   
           return schedAIO(root, func, arg, acb, buffer, buflen);
   #endif
   }
   
   /*
  * schedTimer() - Add TIMER task to scheduler queue   * schedTimer() - Add TIMER task to scheduler queue
  *   *
  * @root = root task   * @root = root task
Line 511  sched_task_t * Line 670  sched_task_t *
 schedTimer(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, struct timespec ts,   schedTimer(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, struct timespec ts, 
                 void *opt_data, size_t opt_dlen)                  void *opt_data, size_t opt_dlen)
 {  {
        sched_task_t *task, *t = NULL;        sched_task_t *task, *tmp, *t = NULL;
         void *ptr;          void *ptr;
         struct timespec now;          struct timespec now;
   
Line 522  schedTimer(sched_root_task_t * __restrict root, sched_ Line 681  schedTimer(sched_root_task_t * __restrict root, sched_
         if (!(task = _sched_useTask(root)))          if (!(task = _sched_useTask(root)))
                 return NULL;                  return NULL;
   
         memset(task, 0, sizeof(sched_task_t));  
         task->task_id = 0;  
         task->task_lock = 0;  
         task->task_func = func;          task->task_func = func;
         TASK_TYPE(task) = taskTIMER;          TASK_TYPE(task) = taskTIMER;
         TASK_ROOT(task) = root;          TASK_ROOT(task) = root;
Line 557  schedTimer(sched_root_task_t * __restrict root, sched_ Line 713  schedTimer(sched_root_task_t * __restrict root, sched_
                 pthread_mutex_lock(&root->root_mtx[taskTIMER]);                  pthread_mutex_lock(&root->root_mtx[taskTIMER]);
 #endif  #endif
 #ifdef TIMER_WITHOUT_SORT  #ifdef TIMER_WITHOUT_SORT
                TAILQ_INSERT_TAIL(&root->root_timer, task, task_node);                TAILQ_INSERT_TAIL(&root->root_timer, TASK_ID(task), task_node);
 #else  #else
                TAILQ_FOREACH(t, &root->root_timer, task_node)                TAILQ_FOREACH_SAFE(t, &root->root_timer, task_node, tmp)
                         if (sched_timespeccmp(&TASK_TS(task), &TASK_TS(t), -) < 1)                          if (sched_timespeccmp(&TASK_TS(task), &TASK_TS(t), -) < 1)
                                 break;                                  break;
                 if (!t)                  if (!t)
                        TAILQ_INSERT_TAIL(&root->root_timer, task, task_node);                        TAILQ_INSERT_TAIL(&root->root_timer, TASK_ID(task), task_node);
                 else                  else
                        TAILQ_INSERT_BEFORE(t, task, task_node);                        TAILQ_INSERT_BEFORE(t, TASK_ID(task), task_node);
 #endif  #endif
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_unlock(&root->root_mtx[taskTIMER]);                  pthread_mutex_unlock(&root->root_mtx[taskTIMER]);
Line 601  schedEvent(sched_root_task_t * __restrict root, sched_ Line 757  schedEvent(sched_root_task_t * __restrict root, sched_
         if (!(task = _sched_useTask(root)))          if (!(task = _sched_useTask(root)))
                 return NULL;                  return NULL;
   
         memset(task, 0, sizeof(sched_task_t));  
         task->task_id = 0;  
         task->task_lock = 0;  
         task->task_func = func;          task->task_func = func;
         TASK_TYPE(task) = taskEVENT;          TASK_TYPE(task) = taskEVENT;
         TASK_ROOT(task) = root;          TASK_ROOT(task) = root;
Line 623  schedEvent(sched_root_task_t * __restrict root, sched_ Line 776  schedEvent(sched_root_task_t * __restrict root, sched_
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_lock(&root->root_mtx[taskEVENT]);                  pthread_mutex_lock(&root->root_mtx[taskEVENT]);
 #endif  #endif
                TAILQ_INSERT_TAIL(&root->root_event, task, task_node);                TAILQ_INSERT_TAIL(&root->root_event, TASK_ID(task), task_node);
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_unlock(&root->root_mtx[taskEVENT]);                  pthread_mutex_unlock(&root->root_mtx[taskEVENT]);
 #endif  #endif
Line 659  schedEventLo(sched_root_task_t * __restrict root, sche Line 812  schedEventLo(sched_root_task_t * __restrict root, sche
         if (!(task = _sched_useTask(root)))          if (!(task = _sched_useTask(root)))
                 return NULL;                  return NULL;
   
         memset(task, 0, sizeof(sched_task_t));  
         task->task_id = 0;  
         task->task_lock = 0;  
         task->task_func = func;          task->task_func = func;
         TASK_TYPE(task) = taskEVENT;          TASK_TYPE(task) = taskEVENT;
         TASK_ROOT(task) = root;          TASK_ROOT(task) = root;
Line 681  schedEventLo(sched_root_task_t * __restrict root, sche Line 831  schedEventLo(sched_root_task_t * __restrict root, sche
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_lock(&root->root_mtx[taskEVENTLO]);                  pthread_mutex_lock(&root->root_mtx[taskEVENTLO]);
 #endif  #endif
                TAILQ_INSERT_TAIL(&root->root_eventlo, task, task_node);                TAILQ_INSERT_TAIL(&root->root_eventlo, TASK_ID(task), task_node);
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                 pthread_mutex_unlock(&root->root_mtx[taskEVENTLO]);                  pthread_mutex_unlock(&root->root_mtx[taskEVENTLO]);
 #endif  #endif
Line 692  schedEventLo(sched_root_task_t * __restrict root, sche Line 842  schedEventLo(sched_root_task_t * __restrict root, sche
 }  }
   
 /*  /*
    * schedSuspend() - Add Suspended task to scheduler queue
    *
    * @root = root task
    * @func = task execution function
    * @arg = 1st func argument
    * @id = Trigger ID
    * @opt_data = Optional data
    * @opt_dlen = Optional data length
    * return: NULL error or !=NULL new queued task
    */
   sched_task_t *
   schedSuspend(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, u_long id, 
                   void *opt_data, size_t opt_dlen)
   {
           sched_task_t *task;
           void *ptr;
   
           if (!root || !func)
                   return NULL;
   
           /* get new task */
           if (!(task = _sched_useTask(root)))
                   return NULL;
   
           task->task_func = func;
           TASK_TYPE(task) = taskSUSPEND;
           TASK_ROOT(task) = root;
   
           TASK_ARG(task) = arg;
           TASK_VAL(task) = id;
   
           TASK_DATA(task) = opt_data;
           TASK_DATLEN(task) = opt_dlen;
   
           if (root->root_hooks.hook_add.suspend)
                   ptr = root->root_hooks.hook_add.suspend(task, NULL);
           else
                   ptr = NULL;
   
           if (!ptr) {
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_lock(&root->root_mtx[taskSUSPEND]);
   #endif
                   TAILQ_INSERT_TAIL(&root->root_suspend, TASK_ID(task), task_node);
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_unlock(&root->root_mtx[taskSUSPEND]);
   #endif
           } else
                   task = _sched_unuseTask(task);
   
           return task;
   }
   
   /*
  * schedCallOnce() - Call once from scheduler   * schedCallOnce() - Call once from scheduler
  *   *
  * @root = root task   * @root = root task
Line 716  schedCallOnce(sched_root_task_t * __restrict root, sch Line 920  schedCallOnce(sched_root_task_t * __restrict root, sch
         if (!(task = _sched_useTask(root)))          if (!(task = _sched_useTask(root)))
                 return NULL;                  return NULL;
   
         memset(task, 0, sizeof(sched_task_t));  
         task->task_id = 0;  
         task->task_lock = 0;  
         task->task_func = func;          task->task_func = func;
         TASK_TYPE(task) = taskEVENT;          TASK_TYPE(task) = taskEVENT;
         TASK_ROOT(task) = root;          TASK_ROOT(task) = root;

Removed from v.1.8.2.1  
changed lines
  Added in v.1.10.2.4


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