Diff for /libaitsched/src/tasks.c between versions 1.10.2.6 and 1.12

version 1.10.2.6, 2012/08/02 09:19:31 version 1.12, 2012/08/08 08:25:39
Line 482  schedAlarm(sched_root_task_t * __restrict root, sched_ Line 482  schedAlarm(sched_root_task_t * __restrict root, sched_
         return task;          return task;
 }  }
   
#ifdef EVFILT_AIO#ifdef AIO_SUPPORT
 /*  /*
  * schedAIO() - Add AIO task to scheduler queue   * schedAIO() - Add AIO task to scheduler queue
  *   *
Line 546  schedAIO(sched_root_task_t * __restrict root, sched_ta Line 546  schedAIO(sched_root_task_t * __restrict root, sched_ta
  * @fd = file descriptor   * @fd = file descriptor
  * @buffer = Buffer   * @buffer = Buffer
  * @buflen = Buffer length   * @buflen = Buffer length
    * @offset = Offset from start of file, if =-1 from current position
  * return: NULL error or !=NULL new queued task   * return: NULL error or !=NULL new queued task
  */   */
 inline sched_task_t *  inline sched_task_t *
 schedAIORead(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd,   schedAIORead(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd, 
                void *buffer, size_t buflen)                void *buffer, size_t buflen, off_t offset)
 {  {
         struct aiocb *acb;          struct aiocb *acb;
        off_t off = 0;        off_t off;
   
         if (!root || !func || !buffer || !buflen)          if (!root || !func || !buffer || !buflen)
                 return NULL;                  return NULL;
         else  
                 memset(buffer, 0, buflen);  
   
           if (offset == (off_t) -1) {
                   off = lseek(fd, 0, SEEK_CUR);
                   if (off == -1) {
                           LOGERR;
                           return NULL;
                   }
           } else
                   off = offset;
   
         if (!(acb = malloc(sizeof(struct aiocb)))) {          if (!(acb = malloc(sizeof(struct aiocb)))) {
                 LOGERR;                  LOGERR;
                 return NULL;                  return NULL;
Line 569  schedAIORead(sched_root_task_t * __restrict root, sche Line 577  schedAIORead(sched_root_task_t * __restrict root, sche
         acb->aio_fildes = fd;          acb->aio_fildes = fd;
         acb->aio_nbytes = buflen;          acb->aio_nbytes = buflen;
         acb->aio_buf = buffer;          acb->aio_buf = buffer;
        off = lseek(fd, 0, SEEK_CUR);        acb->aio_offset = off;
        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 = SIGEV_KEVENT;
         acb->aio_sigevent.sigev_notify_kqueue = root->root_kq;          acb->aio_sigevent.sigev_notify_kqueue = root->root_kq;
         acb->aio_sigevent.sigev_value.sival_ptr = acb;          acb->aio_sigevent.sigev_value.sival_ptr = acb;
Line 598  schedAIORead(sched_root_task_t * __restrict root, sche Line 600  schedAIORead(sched_root_task_t * __restrict root, sche
  * @fd = file descriptor   * @fd = file descriptor
  * @buffer = Buffer   * @buffer = Buffer
  * @buflen = Buffer length   * @buflen = Buffer length
    * @offset = Offset from start of file, if =-1 from current position
  * return: NULL error or !=NULL new queued task   * return: NULL error or !=NULL new queued task
  */   */
 inline sched_task_t *  inline sched_task_t *
 schedAIOWrite(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd,   schedAIOWrite(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd, 
                void *buffer, size_t buflen)                void *buffer, size_t buflen, off_t offset)
 {  {
         struct aiocb *acb;          struct aiocb *acb;
        off_t off = 0;        off_t off;
   
         if (!root || !func || !buffer || !buflen)          if (!root || !func || !buffer || !buflen)
                 return NULL;                  return NULL;
   
           if (offset == (off_t) -1) {
                   off = lseek(fd, 0, SEEK_CUR);
                   if (off == -1) {
                           LOGERR;
                           return NULL;
                   }
           } else
                   off = offset;
   
         if (!(acb = malloc(sizeof(struct aiocb)))) {          if (!(acb = malloc(sizeof(struct aiocb)))) {
                 LOGERR;                  LOGERR;
                 return NULL;                  return NULL;
Line 619  schedAIOWrite(sched_root_task_t * __restrict root, sch Line 631  schedAIOWrite(sched_root_task_t * __restrict root, sch
         acb->aio_fildes = fd;          acb->aio_fildes = fd;
         acb->aio_nbytes = buflen;          acb->aio_nbytes = buflen;
         acb->aio_buf = buffer;          acb->aio_buf = buffer;
        off = lseek(fd, 0, SEEK_CUR);        acb->aio_offset = off;
        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 = SIGEV_KEVENT;
         acb->aio_sigevent.sigev_notify_kqueue = root->root_kq;          acb->aio_sigevent.sigev_notify_kqueue = root->root_kq;
         acb->aio_sigevent.sigev_value.sival_ptr = acb;          acb->aio_sigevent.sigev_value.sival_ptr = acb;
Line 641  schedAIOWrite(sched_root_task_t * __restrict root, sch Line 647  schedAIOWrite(sched_root_task_t * __restrict root, sch
   
 #ifdef EVFILT_LIO  #ifdef EVFILT_LIO
 /*  /*
    * schedLIO() - Add AIO bulk tasks to scheduler queue
    *
    * @root = root task
    * @func = task execution function
    * @arg = 1st func argument
    * @acbs = AIO cb structure addresses
    * @opt_data = Optional data
    * @opt_dlen = Optional data length
    * return: NULL error or !=NULL new queued task
    */
   sched_task_t *
   schedLIO(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, 
                   struct aiocb ** __restrict acbs, void *opt_data, size_t opt_dlen)
   {
           sched_task_t *task;
           void *ptr;
   
           if (!root || !func || !acbs || !opt_dlen)
                   return NULL;
   
           /* get new task */
           if (!(task = _sched_useTask(root)))
                   return NULL;
   
           task->task_func = func;
           TASK_TYPE(task) = taskLIO;
           TASK_ROOT(task) = root;
   
           TASK_ARG(task) = arg;
           TASK_VAL(task) = (u_long) acbs;
   
           TASK_DATA(task) = opt_data;
           TASK_DATLEN(task) = opt_dlen;
   
           if (root->root_hooks.hook_add.lio)
                   ptr = root->root_hooks.hook_add.lio(task, NULL);
           else
                   ptr = NULL;
   
           if (!ptr) {
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_lock(&root->root_mtx[taskLIO]);
   #endif
                   TAILQ_INSERT_TAIL(&root->root_lio, TASK_ID(task), task_node);
   #ifdef HAVE_LIBPTHREAD
                   pthread_mutex_unlock(&root->root_mtx[taskLIO]);
   #endif
           } else
                   task = _sched_unuseTask(task);
   
           return task;
   }
   
   /*
  * schedLIORead() - Add list of AIO read tasks to scheduler queue   * schedLIORead() - Add list of AIO read tasks to scheduler queue
  *   *
  * @root = root task   * @root = root task
Line 649  schedAIOWrite(sched_root_task_t * __restrict root, sch Line 709  schedAIOWrite(sched_root_task_t * __restrict root, sch
  * @fd = file descriptor   * @fd = file descriptor
  * @bufs = Buffer's list   * @bufs = Buffer's list
  * @nbufs = Number of Buffers   * @nbufs = Number of Buffers
    * @offset = Offset from start of file, if =-1 from current position
  * return: NULL error or !=NULL new queued task   * return: NULL error or !=NULL new queued task
  */   */
inline sched_task_t *sched_task_t *
 schedLIORead(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd,   schedLIORead(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd, 
                struct iovec *bufs, size_t nbufs)                struct iovec *bufs, size_t nbufs, off_t offset)
 {  {
         struct sigevent sig;          struct sigevent sig;
         struct aiocb **acb;          struct aiocb **acb;
Line 663  schedLIORead(sched_root_task_t * __restrict root, sche Line 724  schedLIORead(sched_root_task_t * __restrict root, sche
         if (!root || !func || !bufs || !nbufs)          if (!root || !func || !bufs || !nbufs)
                 return NULL;                  return NULL;
   
        off = lseek(fd, 0, SEEK_CUR);        if (offset == (off_t) -1) {
        if (off == -1) {                off = lseek(fd, 0, SEEK_CUR);
                LOGERR;                if (off == -1) {
                return NULL;                        LOGERR;
        }                        return NULL;
                 }
         } else
                 off = offset;
   
         if (!(acb = calloc(sizeof(void*), nbufs))) {          if (!(acb = calloc(sizeof(void*), nbufs))) {
                 LOGERR;                  LOGERR;
Line 681  schedLIORead(sched_root_task_t * __restrict root, sche Line 745  schedLIORead(sched_root_task_t * __restrict root, sche
                         for (i = 0; i < nbufs; i++)                          for (i = 0; i < nbufs; i++)
                                 if (acb[i])                                  if (acb[i])
                                         free(acb[i]);                                          free(acb[i]);
                                free(acb);                        free(acb);
                         return NULL;                          return NULL;
                 } else                  } else
                         memset(acb[i], 0, sizeof(struct aiocb));                          memset(acb[i], 0, sizeof(struct aiocb));
Line 698  schedLIORead(sched_root_task_t * __restrict root, sche Line 762  schedLIORead(sched_root_task_t * __restrict root, sche
   
         if (lio_listio(LIO_NOWAIT, acb, nbufs, &sig)) {          if (lio_listio(LIO_NOWAIT, acb, nbufs, &sig)) {
                 LOGERR;                  LOGERR;
                   for (i = 0; i < nbufs; i++)
                           if (acb[i])
                                   free(acb[i]);
                   free(acb);
                 return NULL;                  return NULL;
         }          }
   
        return schedAIO(root, func, arg, (void*) acb, bufs, nbufs);        return schedLIO(root, func, arg, (void*) acb, bufs, nbufs);
 }  }
   
 /*  /*
Line 713  schedLIORead(sched_root_task_t * __restrict root, sche Line 781  schedLIORead(sched_root_task_t * __restrict root, sche
  * @fd = file descriptor   * @fd = file descriptor
  * @bufs = Buffer's list   * @bufs = Buffer's list
  * @nbufs = Number of Buffers   * @nbufs = Number of Buffers
    * @offset = Offset from start of file, if =-1 from current position
  * return: NULL error or !=NULL new queued task   * return: NULL error or !=NULL new queued task
  */   */
 inline sched_task_t *  inline sched_task_t *
 schedLIOWrite(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd,   schedLIOWrite(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, int fd, 
                struct iovec *bufs, size_t nbufs)                struct iovec *bufs, size_t nbufs, off_t offset)
 {  {
         struct sigevent sig;          struct sigevent sig;
         struct aiocb **acb;          struct aiocb **acb;
Line 727  schedLIOWrite(sched_root_task_t * __restrict root, sch Line 796  schedLIOWrite(sched_root_task_t * __restrict root, sch
         if (!root || !func || !bufs || !nbufs)          if (!root || !func || !bufs || !nbufs)
                 return NULL;                  return NULL;
   
        off = lseek(fd, 0, SEEK_CUR);        if (offset == (off_t) -1) {
        if (off == -1) {                off = lseek(fd, 0, SEEK_CUR);
                LOGERR;                if (off == -1) {
                return NULL;                        LOGERR;
        }                        return NULL;
                 }
         } else
                 off = offset;
   
         if (!(acb = calloc(sizeof(void*), nbufs))) {          if (!(acb = calloc(sizeof(void*), nbufs))) {
                 LOGERR;                  LOGERR;
Line 745  schedLIOWrite(sched_root_task_t * __restrict root, sch Line 817  schedLIOWrite(sched_root_task_t * __restrict root, sch
                         for (i = 0; i < nbufs; i++)                          for (i = 0; i < nbufs; i++)
                                 if (acb[i])                                  if (acb[i])
                                         free(acb[i]);                                          free(acb[i]);
                                free(acb);                        free(acb);
                         return NULL;                          return NULL;
                 } else                  } else
                         memset(acb[i], 0, sizeof(struct aiocb));                          memset(acb[i], 0, sizeof(struct aiocb));
Line 762  schedLIOWrite(sched_root_task_t * __restrict root, sch Line 834  schedLIOWrite(sched_root_task_t * __restrict root, sch
   
         if (lio_listio(LIO_NOWAIT, acb, nbufs, &sig)) {          if (lio_listio(LIO_NOWAIT, acb, nbufs, &sig)) {
                 LOGERR;                  LOGERR;
                   for (i = 0; i < nbufs; i++)
                           if (acb[i])
                                   free(acb[i]);
                   free(acb);
                 return NULL;                  return NULL;
         }          }
   
        return schedAIO(root, func, arg, (void*) acb, bufs, nbufs);        return schedLIO(root, func, arg, (void*) acb, bufs, nbufs);
 }  }
 #endif  /* EVFILT_LIO */  #endif  /* EVFILT_LIO */
#endif  /* EVFILT_AIO */#endif  /* AIO_SUPPORT */
   
 /*  /*
  * schedTimer() - Add TIMER task to scheduler queue   * schedTimer() - Add TIMER task to scheduler queue
Line 903  schedEvent(sched_root_task_t * __restrict root, sched_ Line 979  schedEvent(sched_root_task_t * __restrict root, sched_
   
   
 /*  /*
 * schedEventLo() - Add EVENT_Lo task to scheduler queue * schedTask() - Add regular task to scheduler queue
  *   *
  * @root = root task   * @root = root task
  * @func = task execution function   * @func = task execution function
  * @arg = 1st func argument   * @arg = 1st func argument
 * @val = additional func argument * @prio = regular task priority, 0 is hi priority for regular tasks
  * @opt_data = Optional data   * @opt_data = Optional data
  * @opt_dlen = Optional data length   * @opt_dlen = Optional data length
  * return: NULL error or !=NULL new queued task   * return: NULL error or !=NULL new queued task
  */   */
 sched_task_t *  sched_task_t *
schedEventLo(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, u_long val, schedTask(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, u_long prio, 
                 void *opt_data, size_t opt_dlen)                  void *opt_data, size_t opt_dlen)
 {  {
        sched_task_t *task;        sched_task_t *task, *tmp, *t = NULL;
         void *ptr;          void *ptr;
   
         if (!root || !func)          if (!root || !func)
Line 928  schedEventLo(sched_root_task_t * __restrict root, sche Line 1004  schedEventLo(sched_root_task_t * __restrict root, sche
                 return NULL;                  return NULL;
   
         task->task_func = func;          task->task_func = func;
        TASK_TYPE(task) = taskEVENT;        TASK_TYPE(task) = taskTASK;
         TASK_ROOT(task) = root;          TASK_ROOT(task) = root;
   
         TASK_ARG(task) = arg;          TASK_ARG(task) = arg;
        TASK_VAL(task) = val;        TASK_VAL(task) = prio;
   
         TASK_DATA(task) = opt_data;          TASK_DATA(task) = opt_data;
         TASK_DATLEN(task) = opt_dlen;          TASK_DATLEN(task) = opt_dlen;
   
        if (root->root_hooks.hook_add.eventlo)        if (root->root_hooks.hook_add.task)
                ptr = root->root_hooks.hook_add.eventlo(task, NULL);                ptr = root->root_hooks.hook_add.task(task, NULL);
         else          else
                 ptr = NULL;                  ptr = NULL;
   
         if (!ptr) {          if (!ptr) {
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                pthread_mutex_lock(&root->root_mtx[taskEVENTLO]);                pthread_mutex_lock(&root->root_mtx[taskTASK]);
 #endif  #endif
                TAILQ_INSERT_TAIL(&root->root_eventlo, TASK_ID(task), task_node);                TAILQ_FOREACH_SAFE(t, &root->root_task, task_node, tmp)
                         if (TASK_VAL(task) < TASK_VAL(t))
                                 break;
                 if (!t)
                         TAILQ_INSERT_TAIL(&root->root_task, TASK_ID(task), task_node);
                 else
                         TAILQ_INSERT_BEFORE(t, TASK_ID(task), task_node);
 #ifdef HAVE_LIBPTHREAD  #ifdef HAVE_LIBPTHREAD
                pthread_mutex_unlock(&root->root_mtx[taskEVENTLO]);                pthread_mutex_unlock(&root->root_mtx[taskTASK]);
 #endif  #endif
         } else          } else
                 task = _sched_unuseTask(task);                  task = _sched_unuseTask(task);

Removed from v.1.10.2.6  
changed lines
  Added in v.1.12


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