Diff for /libaitsched/inc/aitsched.h between versions 1.13 and 1.20

version 1.13, 2012/08/08 08:25:39 version 1.20, 2013/08/15 19:10:48
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, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
         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 53  SUCH DAMAGE. Line 53  SUCH DAMAGE.
 #include <sys/uio.h>  #include <sys/uio.h>
 #include <stdint.h>  #include <stdint.h>
 #include <pthread.h>  #include <pthread.h>
   #include <assert.h>
 #ifdef EVFILT_LIO  #ifdef EVFILT_LIO
 #include <aio.h>  #include <aio.h>
 #endif  #endif
Line 89  typedef enum { Line 90  typedef enum {
         taskSUSPEND,           taskSUSPEND, 
         taskREADY,          taskREADY,
         taskUNUSE,          taskUNUSE,
           taskTHREAD, 
           taskRTC,
         taskMAX          taskMAX
 } sched_task_type_t;  } sched_task_type_t;
   
Line 122  struct sched_HooksTask { Line 125  struct sched_HooksTask {
                 sched_hook_func_t       task;                  sched_hook_func_t       task;
                 /* suspend(sched_task_t *task, NULL) -> int */                  /* suspend(sched_task_t *task, NULL) -> int */
                 sched_hook_func_t       suspend;                  sched_hook_func_t       suspend;
                   /* thread(sched_task_t *task, NULL) -> int */
                   sched_hook_func_t       thread;
                   /* rtc(sched_task_t *task, NULL) -> int */
                   sched_hook_func_t       rtc;
         }       hook_add;          }       hook_add;
         struct {          struct {
                   /* exit(sched_task_t *task, void *exitValue) -> int */
                   sched_hook_func_t       exit;
                 /* cancel(sched_task_t *task, NULL) -> int */                  /* cancel(sched_task_t *task, NULL) -> int */
                 sched_hook_func_t       cancel;                  sched_hook_func_t       cancel;
                 /* resume(sched_task_t *task, NULL) -> int */                  /* resume(sched_task_t *task, NULL) -> int */
Line 158  typedef void *(*sched_task_func_t)(sched_task_t * /* c Line 167  typedef void *(*sched_task_func_t)(sched_task_t * /* c
   
 /* task & queue */  /* task & queue */
 struct sched_Task {  struct sched_Task {
         volatile int                    task_lock;  
         uintptr_t                       task_id;          uintptr_t                       task_id;
 #define TASK_ID(x)      ((struct sched_Task*) (x)->task_id)  #define TASK_ID(x)      ((struct sched_Task*) (x)->task_id)
         sched_task_type_t               task_type;          sched_task_type_t               task_type;
 #define TASK_TYPE(x)    (x)->task_type  #define TASK_TYPE(x)    (x)->task_type
           volatile int                    task_lock;
   
         sched_root_task_t               *task_root;          sched_root_task_t               *task_root;
 #define TASK_ROOT(x)    (x)->task_root  #define TASK_ROOT(x)    (x)->task_root
         sched_task_func_t               task_func;          sched_task_func_t               task_func;
 #define TASK_FUNC(x)    (x)->task_func  #define TASK_FUNC(x)    (x)->task_func
           intptr_t                        task_ret;
   #define TASK_RET(x)     (x)->task_ret
           unsigned long                   task_flag;
   #define TASK_FLAG(x)    (x)->task_flag
   
         void                            *task_arg;          void                            *task_arg;
         union {          union {
Line 197  typedef TAILQ_HEAD(, sched_Task) sched_queue_t; Line 210  typedef TAILQ_HEAD(, sched_Task) sched_queue_t;
 /* root task */  /* root task */
 struct sched_RootTask {  struct sched_RootTask {
         int             root_kq;          int             root_kq;
        unsigned int        root_miss;        unsigned long        root_miss;
        unsigned int    root_task_miss; 
         struct timespec root_wait;          struct timespec root_wait;
         struct timespec root_poll;          struct timespec root_poll;
         intptr_t        root_cond;          intptr_t        root_cond;
Line 221  struct sched_RootTask { Line 233  struct sched_RootTask {
         sched_queue_t   root_suspend;          sched_queue_t   root_suspend;
         sched_queue_t   root_ready;          sched_queue_t   root_ready;
         sched_queue_t   root_unuse;          sched_queue_t   root_unuse;
           sched_queue_t   root_thread;
           sched_queue_t   root_rtc;
   
         hooks_task_t    root_hooks;          hooks_task_t    root_hooks;
         struct iovec    root_data;          struct iovec    root_data;
Line 231  struct sched_RootTask { Line 245  struct sched_RootTask {
 #define ROOT_RETURN(x)  (x)->root_ret  #define ROOT_RETURN(x)  (x)->root_ret
   
   
inline int sched_GetErrno();int sched_GetErrno();
inline const char *sched_GetError();const char *sched_GetError();
   
   
 /*  /*
Line 259  int schedEnd(sched_root_task_t ** __restrict root); Line 273  int schedEnd(sched_root_task_t ** __restrict root);
  */   */
 int schedRegisterHooks(sched_root_task_t * __restrict root);  int schedRegisterHooks(sched_root_task_t * __restrict root);
 /*  /*
    * sched_useTask() - Get and init new task
    *
    * @root = root task
    * return: NULL error or !=NULL prepared task
    */
   sched_task_t *sched_useTask(sched_root_task_t * __restrict root);
   /*
    * sched_unuseTask() - Unlock and put task to unuse queue
    *
    * @task = task
    * return: always is NULL
    */
   sched_task_t *sched_unuseTask(sched_task_t * __restrict task);
   /*
  * schedPolling() - Polling timeout period if no timer task is present   * schedPolling() - Polling timeout period if no timer task is present
  *   *
  * @root = root task   * @root = root task
Line 266  int schedRegisterHooks(sched_root_task_t * __restrict  Line 294  int schedRegisterHooks(sched_root_task_t * __restrict 
  * @tsold = old timeout polling if !=NULL   * @tsold = old timeout polling if !=NULL
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline int schedPolling(sched_root_task_t * __restrict root, int schedPolling(sched_root_task_t * __restrict root, 
                 struct timespec * __restrict ts, struct timespec * __restrict tsold);                  struct timespec * __restrict ts, struct timespec * __restrict tsold);
 /*  /*
  * schedTermCondition() - Activate hook for scheduler condition kill   * schedTermCondition() - Activate hook for scheduler condition kill
Line 275  inline int schedPolling(sched_root_task_t * __restrict Line 303  inline int schedPolling(sched_root_task_t * __restrict
  * @condValue = condition value, kill schedRun() if condValue == killState   * @condValue = condition value, kill schedRun() if condValue == killState
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline int schedTermCondition(sched_root_task_t * __restrict root, intptr_t condValue);int schedTermCondition(sched_root_task_t * __restrict root, intptr_t condValue);
 /*  /*
  * schedMissEvents() - Set new miss events rate for regular tasks  
  *  
  * @root = root task  
  * @missEvents = maximum number of missed events before firing tasks  
  * return: -1 error or 0 ok  
  */  
 inline int schedMissEvents(sched_root_task_t * __restrict root, u_int missEvents);  
 /*  
  * schedCall() - Call task execution function   * schedCall() - Call task execution function
  *   *
  * @task = current task   * @task = current task
  * return: !=NULL error or =NULL ok   * return: !=NULL error or =NULL ok
  */   */
inline void *schedCall(sched_task_t * __restrict task);void *schedCall(sched_task_t * __restrict task);
 /*  /*
  * schedFetch() - Fetch ready task   * schedFetch() - Fetch ready task
  *   *
  * @root = root task   * @root = root task
  * return: =NULL error or !=NULL ready task   * return: =NULL error or !=NULL ready task
  */   */
inline void *schedFetch(sched_root_task_t * __restrict root);void *schedFetch(sched_root_task_t * __restrict root);
 /*  /*
  * schedRun() - Scheduler *run loop*   * schedRun() - Scheduler *run loop*
  *   *
Line 365  sched_task_t *schedWrite(sched_root_task_t * __restric Line 385  sched_task_t *schedWrite(sched_root_task_t * __restric
  * @func = task execution function   * @func = task execution function
  * @arg = 1st func argument   * @arg = 1st func argument
  * @ts = timeout argument structure, minimum alarm timer resolution is 1msec!   * @ts = timeout argument structure, minimum alarm timer resolution is 1msec!
 * @opt_data = Optional data * @opt_data = Alarm timer ID
  * @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
  */   */
Line 374  sched_task_t *schedAlarm(sched_root_task_t * __restric Line 394  sched_task_t *schedAlarm(sched_root_task_t * __restric
 #define schedAlarmSelf(x)       schedAlarm(TASK_ROOT((x)), TASK_FUNC((x)), TASK_ARG((x)), \  #define schedAlarmSelf(x)       schedAlarm(TASK_ROOT((x)), TASK_FUNC((x)), TASK_ARG((x)), \
                 TASK_TS((x)), TASK_DATA((x)), TASK_DATLEN((x)))                  TASK_TS((x)), TASK_DATA((x)), TASK_DATLEN((x)))
 /*  /*
    * schedRTC() - Add RTC task to scheduler queue
    *
    * @root = root task
    * @func = task execution function
    * @arg = 1st func argument
    * @ts = timeout argument structure, minimum alarm timer resolution is 1msec!
    * @opt_data = Optional RTC ID
    * @opt_dlen = Optional Signal No.
    * return: NULL error or !=NULL new queued task
    */
   sched_task_t *schedRTC(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, 
                   struct timespec ts, void *opt_data, size_t opt_dlen);
   #define schedRTCSelf(x)         schedRTC(TASK_ROOT((x)), TASK_FUNC((x)), TASK_ARG((x)), \
                   TASK_TS((x)), TASK_DATA((x)), TASK_DATLEN((x)))
   /*
  * schedNode() - Add NODE task to scheduler queue   * schedNode() - Add NODE task to scheduler queue
  *   *
  * @root = root task   * @root = root task
Line 445  sched_task_t *schedAIO(sched_root_task_t * __restrict  Line 480  sched_task_t *schedAIO(sched_root_task_t * __restrict 
  * @offset = Offset from start of file, if =-1 from current position   * @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 *schedAIORead(sched_root_task_t * __restrict root, sched_task_func_t func, sched_task_t *schedAIORead(sched_root_task_t * __restrict root, sched_task_func_t func, 
                 void *arg, int fd, void *buffer, size_t buflen, off_t offset);                  void *arg, int fd, void *buffer, size_t buflen, off_t offset);
 /*  /*
  * schedAIOWrite() - Add AIO write task to scheduler queue   * schedAIOWrite() - Add AIO write task to scheduler queue
Line 459  inline sched_task_t *schedAIORead(sched_root_task_t *  Line 494  inline sched_task_t *schedAIORead(sched_root_task_t * 
  * @offset = Offset from start of file, if =-1 from current position   * @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 *schedAIOWrite(sched_root_task_t * __restrict root, sched_task_func_t func, sched_task_t *schedAIOWrite(sched_root_task_t * __restrict root, sched_task_func_t func, 
                 void *arg, int fd, void *buffer, size_t buflen, off_t offset);                  void *arg, int fd, void *buffer, size_t buflen, off_t offset);
   
 /*  /*
Line 487  sched_task_t *schedLIO(sched_root_task_t * __restrict  Line 522  sched_task_t *schedLIO(sched_root_task_t * __restrict 
  * @offset = Offset from start of file, if =-1 from current position   * @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 *schedLIORead(sched_root_task_t * __restrict root, sched_task_func_t func, sched_task_t *schedLIORead(sched_root_task_t * __restrict root, sched_task_func_t func, 
                 void *arg, int fd, struct iovec *bufs, size_t nbufs, off_t offset);                  void *arg, int fd, struct iovec *bufs, size_t nbufs, off_t offset);
 /*  /*
  * schedLIOWrite() - Add list of AIO write tasks to scheduler queue   * schedLIOWrite() - Add list of AIO write tasks to scheduler queue
Line 501  inline sched_task_t *schedLIORead(sched_root_task_t *  Line 536  inline sched_task_t *schedLIORead(sched_root_task_t * 
  * @offset = Offset from start of file, if =-1 from current position   * @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 *schedLIOWrite(sched_root_task_t * __restrict root, sched_task_func_t func, sched_task_t *schedLIOWrite(sched_root_task_t * __restrict root, sched_task_func_t func, 
                 void *arg, int fd, struct iovec *bufs, size_t nbufs, off_t offset);                  void *arg, int fd, struct iovec *bufs, size_t nbufs, off_t offset);
 #endif  /* EVFILT_LIO */  #endif  /* EVFILT_LIO */
   
Line 541  int schedTrigger(sched_task_t * __restrict task); Line 576  int schedTrigger(sched_task_t * __restrict task);
  */   */
 sched_task_t *schedTimer(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg,   sched_task_t *schedTimer(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, 
                 struct timespec ts, void *opt_data, size_t opt_dlen);                  struct timespec ts, void *opt_data, size_t opt_dlen);
 #define schedTimerSelf(x)       schedTimer(TASK_ROOT((x)), TASK_FUNC((x)), TASK_ARG((x)), \  
                 TASK_TS((x)), TASK_DATA((x)), TASK_DATLEN((x)))  
 /*  /*
  * schedEvent() - Add EVENT task to scheduler queue   * schedEvent() - Add EVENT task to scheduler queue
  *   *
Line 614  sched_task_t *schedCallOnce(sched_root_task_t * __rest Line 647  sched_task_t *schedCallOnce(sched_root_task_t * __rest
                 unsigned long val, void *opt_data, size_t opt_dlen);                  unsigned long val, void *opt_data, size_t opt_dlen);
 #define schedCallAgain(x)       schedCallOnce(TASK_ROOT((x)), TASK_FUNC((x)), TASK_ARG((x)), \  #define schedCallAgain(x)       schedCallOnce(TASK_ROOT((x)), TASK_FUNC((x)), TASK_ARG((x)), \
                 TASK_VAL((x)), TASK_DATA((x)), TASK_DATLEN((x)))                  TASK_VAL((x)), TASK_DATA((x)), TASK_DATLEN((x)))
   
   /*
    * schedThread() - Add thread task to scheduler queue
    *
    * @root = root task
    * @func = task execution function
    * @arg = 1st func argument
    * @detach = Detach thread from scheduler, if !=0
    * @ss = stack size
    * @opt_data = Optional data
    * @opt_dlen = Optional data length
    * return: NULL error or !=NULL new queued task
    */
   sched_task_t *schedThread(sched_root_task_t * __restrict root, sched_task_func_t func, void *arg, 
                   int detach, size_t ss, void *opt_data, size_t opt_dlen);
   #define schedThreadSelf(x)      schedThread(TASK_ROOT((x)), TASK_FUNC((x)), TASK_ARG((x)), \
                   (TASK_FLAG((x)) & 0x1), (size_t) (TASK_FLAG((x)) >> 1), TASK_DATA((x)), TASK_DATLEN((x)))
   /*
    * sched_taskExit() - Exit routine for scheduler task, explicit required for thread tasks
    *
    * @task = current task
    * @retcode = return code
    * return: return code
    */
   void *sched_taskExit(sched_task_t *task, intptr_t retcode);
   /*
    * taskExit() - Exit helper for scheduler task
    *
    * @t = current executed task
    * @x = exit value for task
    * return: none
    */
   #define taskExit(t, x)          return sched_taskExit((t), (intptr_t) (x))
   
   
 #endif  #endif

Removed from v.1.13  
changed lines
  Added in v.1.20


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