Added silc_schedule_[set|get]_global. Added many APIs to call
[silc.git] / lib / silcutil / silcschedule.h
index 8c2154a5619e405f63df48f7dc8152307922124e..af2c8cf3d336877212e1a940736ee5333c1c4fb9 100644 (file)
@@ -245,7 +245,8 @@ void func(SilcSchedule schedule, void *app_context, SilcTaskEvent type,     \
  *
  * SYNOPSIS
  *
- *    SilcSchedule silc_schedule_init(int max_tasks, void *app_context);
+ *    SilcSchedule silc_schedule_init(int max_tasks, void *app_context,
+ *                                    SilcStack stack);
  *
  * DESCRIPTION
  *
@@ -261,8 +262,17 @@ void func(SilcSchedule schedule, void *app_context, SilcTaskEvent type,    \
  *    limit can be significantly increased when this function is called in
  *    priviliged mode (as super user).
  *
+ *    If `stack' is non-NULL all memory allocation for the scheduler is done
+ *    from the `stack'.  Scheduler's stack may be retrieved by calling
+ *    silc_schedule_get_stack.  A stack is created for scheduler always even
+ *    if `stack' is NULL.  If it is non-NULL the created stack is a child
+ *    stack using `stack' as its parent.  This means that memory allocated
+ *    by the scheduler will be returned to the `stack' when scheduler is
+ *    destroyed.
+ *
  ***/
-SilcSchedule silc_schedule_init(int max_tasks, void *app_context);
+SilcSchedule silc_schedule_init(int max_tasks, void *app_context,
+                               SilcStack stack);
 
 /****f* silcutil/SilcScheduleAPI/silc_schedule_uninit
  *
@@ -277,6 +287,10 @@ SilcSchedule silc_schedule_init(int max_tasks, void *app_context);
  *    scheduler could not be uninitialized. This happens when the scheduler
  *    is still valid and silc_schedule_stop has not been called.
  *
+ *    If SilcStack was given to silc_schedule_init all memory allocated
+ *    during the life time of the scheduler will be returned back to the
+ *    given stack.
+ *
  ***/
 SilcBool silc_schedule_uninit(SilcSchedule schedule);
 
@@ -378,6 +392,22 @@ void silc_schedule_wakeup(SilcSchedule schedule);
  ***/
 void *silc_schedule_get_context(SilcSchedule schedule);
 
+/****f* silcutil/SilcScheduleAPI/silc_schedule_get_stack
+ *
+ * SYNOPSIS
+ *
+ *    SilcStack silc_schedule_get_stack(SilcSchedule schedule);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the stack of the `schedule'.  If it is used to make memory
+ *    allocations outside the scheduler, it is recommended that a new
+ *    child stack is created by using the returned stack as a parent and
+ *    using the child stack to make the memory allocations.
+ *
+ ***/
+SilcStack silc_schedule_get_stack(SilcSchedule schedule);
+
 /****f* silcutil/SilcScheduleAPI/silc_schedule_set_notify
  *
  * SYNOPSIS
@@ -394,6 +424,47 @@ void *silc_schedule_get_context(SilcSchedule schedule);
 void silc_schedule_set_notify(SilcSchedule schedule,
                              SilcTaskNotifyCb notify, void *context);
 
+/****f* silcutil/SilcScheduleAPI/silc_schedule_set_global
+ *
+ * SYNOPSIS
+ *
+ *    void silc_schedule_set_global(SilcSchedule schedule);
+ *
+ * DESCRIPTION
+ *
+ *    Sets global SilcSchedule `schedule' that can be retrieved at any time
+ *    by using silc_schedule_get_global.  The global scheduler is global only
+ *    to the current thread.  Each thread can have their own global scheduler.
+ *    If each thread must have global scheduler this must be called in each
+ *    thread.  If the global scheduler has been set already, new call will
+ *    replace the old one.
+ *
+ *    This routine is provided only as a convenience function to store
+ *    program's or thread's scheduler in one global place.  It is not mandatory
+ *    to call this function in order to use SilcSchedule.
+ *
+ *    Many routines that require SilcSchedule as an argument will call
+ *    silc_schedule_get_global if the scheduler is not provided to try to
+ *    get global scheduler.  Almost all routines in SilcSchedule API will call
+ *    silc_schedule_get_global if the SilcSchedule is not provided as argument.
+ *
+ ***/
+void silc_schedule_set_global(SilcSchedule schedule);
+
+/****f* silcutil/SilcScheduleAPI/silc_schedule_get_global
+ *
+ * SYNOPSIS
+ *
+ *    SilcSchedule silc_schedule_get_global(void);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the thread's global scheduler that was set by calling
+ *    silc_schedule_set_global or NULL if global scheduler has not been set.
+ *
+ ***/
+SilcSchedule silc_schedule_get_global(void);
+
 /****f* silcutil/SilcScheduleAPI/silc_schedule_task_add_fd
  *
  * SYNOPSIS
@@ -415,6 +486,9 @@ void silc_schedule_set_notify(SilcSchedule schedule,
  *    This returns the new task or NULL on error.  If a task with `fd' has
  *    already been added this will return the existing task pointer.
  *
+ *    If `schedule' is NULL this will call silc_schedule_get_global to try to
+ *    get global scheduler.
+ *
  ***/
 #define silc_schedule_task_add_fd(schedule, fd, callback, context)     \
   silc_schedule_task_add(schedule, fd, callback, context, 0, 0,        SILC_TASK_FD)
@@ -436,6 +510,9 @@ void silc_schedule_set_notify(SilcSchedule schedule,
  *    to the `callback' is SILC_TASK_EXPIRE.  A task added with zero (0)
  *    timeout will be executed immediately next time tasks are scheduled.
  *
+ *    If `schedule' is NULL this will call silc_schedule_get_global to try to
+ *    get global scheduler.
+ *
  ***/
 #define silc_schedule_task_add_timeout(schedule, callback, context, s, u) \
   silc_schedule_task_add(schedule, 0, callback, context, s, u,         \
@@ -457,6 +534,9 @@ void silc_schedule_set_notify(SilcSchedule schedule,
  *    effect when called.  The event delivered to the `callback' is
  *    SILC_TASK_INTERRUPT.
  *
+ *    If `schedule' is NULL this will call silc_schedule_get_global to try to
+ *    get global scheduler.
+ *
  * NOTES
  *
  *    One signal may be registered only one callback.  Adding second callback
@@ -487,6 +567,9 @@ void silc_schedule_set_notify(SilcSchedule schedule,
  *    in task callbacks (including in the task's own task callback) and
  *    in multi-threaded environment in other threads as well.
  *
+ *    If `schedule' is NULL this will call silc_schedule_get_global to try to
+ *    get global scheduler.
+ *
  ***/
 SilcBool silc_schedule_task_del(SilcSchedule schedule, SilcTask task);
 
@@ -506,6 +589,9 @@ SilcBool silc_schedule_task_del(SilcSchedule schedule, SilcTask task);
  *    in task callbacks (including in the task's own task callback) and
  *    in multi-threaded environment in other threads as well.
  *
+ *    If `schedule' is NULL this will call silc_schedule_get_global to try to
+ *    get global scheduler.
+ *
  ***/
 SilcBool silc_schedule_task_del_by_fd(SilcSchedule schedule, SilcUInt32 fd);
 
@@ -526,6 +612,9 @@ SilcBool silc_schedule_task_del_by_fd(SilcSchedule schedule, SilcUInt32 fd);
  *    in task callbacks (including in the task's own task callback) and
  *    in multi-threaded environment in other threads as well.
  *
+ *    If `schedule' is NULL this will call silc_schedule_get_global to try to
+ *    get global scheduler.
+ *
  ***/
 SilcBool silc_schedule_task_del_by_callback(SilcSchedule schedule,
                                            SilcTaskCallback callback);
@@ -546,6 +635,9 @@ SilcBool silc_schedule_task_del_by_callback(SilcSchedule schedule,
  *    in task callbacks (including in the task's own task callback) and
  *    in multi-threaded environment in other threads as well.
  *
+ *    If `schedule' is NULL this will call silc_schedule_get_global to try to
+ *    get global scheduler.
+ *
  ***/
 SilcBool silc_schedule_task_del_by_context(SilcSchedule schedule,
                                           void *context);
@@ -567,6 +659,9 @@ SilcBool silc_schedule_task_del_by_context(SilcSchedule schedule,
  *    in task callbacks (including in the task's own task callback) and
  *    in multi-threaded environment in other threads as well.
  *
+ *    If `schedule' is NULL this will call silc_schedule_get_global to try to
+ *    get global scheduler.
+ *
  ***/
 SilcBool silc_schedule_task_del_by_all(SilcSchedule schedule, int fd,
                                       SilcTaskCallback callback,
@@ -597,6 +692,9 @@ SilcBool silc_schedule_task_del_by_all(SilcSchedule schedule, int fd,
  *    after the event occurs in reality.  In normal cases the `send_events'
  *    is set to FALSE.
  *
+ *    If `schedule' is NULL this will call silc_schedule_get_global to try to
+ *    get global scheduler.
+ *
  *    Returns FALSE if the operation could not performed and TRUE if it
  *    was a success.
  *
@@ -616,6 +714,9 @@ SilcBool silc_schedule_set_listen_fd(SilcSchedule schedule, SilcUInt32 fd,
  *    Returns the file descriptor `fd' current requested events mask,
  *    or 0 on error.
  *
+ *    If `schedule' is NULL this will call silc_schedule_get_global to try to
+ *    get global scheduler.
+ *
  ***/
 SilcTaskEvent silc_schedule_get_fd_events(SilcSchedule schedule,
                                          SilcUInt32 fd);
@@ -632,6 +733,9 @@ SilcTaskEvent silc_schedule_get_fd_events(SilcSchedule schedule,
  *    file descriptor `fd'. No events will be detected for the `fd'
  *    after calling this function.
  *
+ *    If `schedule' is NULL this will call silc_schedule_get_global to try to
+ *    get global scheduler.
+ *
  ***/
 void silc_schedule_unset_listen_fd(SilcSchedule schedule, SilcUInt32 fd);