Task deletion functions now return boolean value.
[silc.git] / lib / silcutil / silcschedule.h
index e2f4e581d5aeb047e4e08cd2fbaf62807ea2c5be..2151e72c21a63ab8f489302f65c6c3346b5819d9 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1998 - 2006 Pekka Riikonen
+  Copyright (C) 1998 - 2007 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -293,6 +293,14 @@ void silc_schedule_stop(SilcSchedule schedule);
  *    When this returns the program is to be ended. Before this function can
  *    be called, one must call silc_schedule_init function.
  *
+ * NOTES
+ *
+ *    On Windows this will block the program, but will continue dispatching
+ *    window messages, and thus can be used as the main loop of the program.
+ *
+ *    On Symbian this will return immediately.  On Symbian calling
+ *    silc_schedule is same as calling silc_schedule_one.
+ *
  ***/
 void silc_schedule(SilcSchedule schedule);
 
@@ -311,6 +319,10 @@ void silc_schedule(SilcSchedule schedule);
  *    scheduler.  The function will not return in this timeout unless
  *    some other event occurs.
  *
+ *    Typically this would be called from a timeout or idle task
+ *    periodically (typically from 5-50 ms) to schedule SILC tasks.  In
+ *    this case the `timeout_usecs' is usually 0.
+ *
  ***/
 SilcBool silc_schedule_one(SilcSchedule schedule, int timeout_usecs);
 
@@ -363,6 +375,12 @@ void *silc_schedule_get_context(SilcSchedule schedule);
  *    handle.  To receive events for the file descriptor set the correct
  *    request events with silc_schedule_set_listen_fd function.
  *
+ *    The task will be initially set for SILC_TASK_READ events.  Setting that
+ *    event immediately after this call returns is not necessary.
+ *
+ *    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.
+ *
  ***/
 #define silc_schedule_task_add_fd(schedule, fd, callback, context)     \
   silc_schedule_task_add(schedule, fd, callback, context, 0, 0,        SILC_TASK_FD)
@@ -414,113 +432,120 @@ void *silc_schedule_get_context(SilcSchedule schedule);
  *    the signal call silc_schedule_task_del_by_fd.
  *
  ***/
-#define silc_schedule_task_add_signal(schedule, signal, callback, context) \
-  silc_schedule_task_add(schedule, signal, callback, context, 0, 0,    \
+#define silc_schedule_task_add_signal(schedule, sig, callback, context) \
+  silc_schedule_task_add(schedule, sig, callback, context, 0, 0,       \
                         SILC_TASK_SIGNAL)
 
 /****f* silcutil/SilcScheduleAPI/silc_schedule_task_del
  *
  * SYNOPSIS
  *
- *    void silc_schedule_task_del(SilcSchedule schedule, SilcTask task);
+ *    SilcBool silc_schedule_task_del(SilcSchedule schedule, SilcTask task);
  *
  * DESCRIPTION
  *
  *    Deletes the `task' from the scheduler indicated by the `schedule'.
  *    After deleting the task it is guaranteed that the task callback
  *    will not be called. If the `task' is SILC_ALL_TASKS then all
- *    tasks is removed from the scheduler.
+ *    tasks is removed from the scheduler.  Returns always TRUE.
  *
  *    It is safe to call this function in any place. Tasks may be removed
  *    in task callbacks (including in the task's own task callback) and
  *    in multi-threaded environment in other threads as well.
  *
  ***/
-void silc_schedule_task_del(SilcSchedule schedule, SilcTask task);
+SilcBool silc_schedule_task_del(SilcSchedule schedule, SilcTask task);
 
 /****f* silcutil/SilcScheduleAPI/silc_schedule_task_del_by_fd
  *
  * SYNOPSIS
  *
- *    void silc_schedule_task_del_by_fd(SilcSchedule schedule, SilcUInt32 fd);
+ *    SilcBool silc_schedule_task_del_by_fd(SilcSchedule schedule,
+ *                                          SilcUInt32 fd);
  *
  * DESCRIPTION
  *
- *    Deletes a task from the scheduler by the specified `fd'.
+ *    Deletes a task from the scheduler by the specified `fd'.  Returns
+ *    FALSE if such fd task does not exist.
  *
  *    It is safe to call this function in any place. Tasks may be removed
  *    in task callbacks (including in the task's own task callback) and
  *    in multi-threaded environment in other threads as well.
  *
  ***/
-void silc_schedule_task_del_by_fd(SilcSchedule schedule, SilcUInt32 fd);
+SilcBool silc_schedule_task_del_by_fd(SilcSchedule schedule, SilcUInt32 fd);
 
 /****f* silcutil/SilcScheduleAPI/silc_schedule_task_del_by_callback
  *
  * SYNOPSIS
  *
- *    void silc_schedule_task_del_by_callback(SilcSchedule schedule,
- *                                            SilcTaskCallback callback);
+ *    SilcBool silc_schedule_task_del_by_callback(SilcSchedule schedule,
+ *                                                SilcTaskCallback callback);
  *
  * DESCRIPTION
  *
  *    Deletes a task from the scheduler by the specified `callback' task
- *    callback function.
+ *    callback function.  Returns FALSE if such task with such callback
+ *    does not exist.
  *
  *    It is safe to call this function in any place. Tasks may be removed
  *    in task callbacks (including in the task's own task callback) and
  *    in multi-threaded environment in other threads as well.
  *
  ***/
-void silc_schedule_task_del_by_callback(SilcSchedule schedule,
-                                       SilcTaskCallback callback);
+SilcBool silc_schedule_task_del_by_callback(SilcSchedule schedule,
+                                           SilcTaskCallback callback);
 
 /****f* silcutil/SilcScheduleAPI/silc_schedule_task_del_by_context
  *
  * SYNOPSIS
  *
- *    void silc_schedule_task_del_by_context(SilcSchedule schedule,
- *                                           void *context);
+ *    SilcBool silc_schedule_task_del_by_context(SilcSchedule schedule,
+ *                                               void *context);
  *
  * DESCRIPTION
  *
- *    Deletes a task from the scheduler by the specified `context'.
+ *    Deletes a task from the scheduler by the specified `context'.  Returns
+ *    FALSE if such task with such context does not exist.
  *
  *    It is safe to call this function in any place. Tasks may be removed
  *    in task callbacks (including in the task's own task callback) and
  *    in multi-threaded environment in other threads as well.
  *
  ***/
-void silc_schedule_task_del_by_context(SilcSchedule schedule, void *context);
+SilcBool silc_schedule_task_del_by_context(SilcSchedule schedule,
+                                          void *context);
 
 /****f* silcutil/SilcScheduleAPI/silc_schedule_task_del_by_all
  *
  * SYNOPSIS
  *
- *    void silc_schedule_task_del_by_all(SilcSchedule schedule, int fd,
- *                                       SilcTaskCallback callback,
- *                                       void *context);
+ *    SilcBool silc_schedule_task_del_by_all(SilcSchedule schedule, int fd,
+ *                                           SilcTaskCallback callback,
+ *                                           void *context);
  *
  * DESCRIPTION
  *
  *    Deletes a task from the scheduler by the specified `fd', `callback'
- *    and `context'.
+ *    and `context'.  Returns FALSE if such task does not exist.
  *
  *    It is safe to call this function in any place. Tasks may be removed
  *    in task callbacks (including in the task's own task callback) and
  *    in multi-threaded environment in other threads as well.
  *
  ***/
-void silc_schedule_task_del_by_all(SilcSchedule schedule, int fd,
-                                  SilcTaskCallback callback, void *context);
+SilcBool silc_schedule_task_del_by_all(SilcSchedule schedule, int fd,
+                                      SilcTaskCallback callback,
+                                      void *context);
 
 /****f* silcutil/SilcScheduleAPI/silc_schedule_set_listen_fd
  *
  * SYNOPSIS
  *
- *    void silc_schedule_set_listen_fd(SilcSchedule schedule, SilcUInt32 fd,
- *                                     SilcTaskEvent mask,
- *                                     SilcBool send_events);
+ *    SilcBool silc_schedule_set_listen_fd(SilcSchedule schedule,
+ *                                         SilcUInt32 fd,
+ *                                         SilcTaskEvent mask,
+ *                                         SilcBool send_events);
  *
  * DESCRIPTION
  *
@@ -538,9 +563,28 @@ void 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.
  *
+ *    Returns FALSE if the operation could not performed and TRUE if it
+ *    was a success.
+ *
+ ***/
+SilcBool silc_schedule_set_listen_fd(SilcSchedule schedule, SilcUInt32 fd,
+                                    SilcTaskEvent mask, SilcBool send_events);
+
+/****f* silcutil/SilcScheduleAPI/silc_schedule_get_fd_events
+ *
+ * SYNOPSIS
+ *
+ *    SilcTaskEvent silc_schedule_get_fd_events(SilcSchedule schedule,
+ *                                              SilcUInt32 fd);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the file descriptor `fd' current requested events mask,
+ *    or 0 on error.
+ *
  ***/
-void silc_schedule_set_listen_fd(SilcSchedule schedule, SilcUInt32 fd,
-                                SilcTaskEvent mask, SilcBool send_events);
+SilcTaskEvent silc_schedule_get_fd_events(SilcSchedule schedule,
+                                         SilcUInt32 fd);
 
 /****f* silcutil/SilcScheduleAPI/silc_schedule_unset_listen_fd
  *