/* Invalidates task */
-void silc_schedule_task_del(SilcSchedule schedule, SilcTask task)
+SilcBool silc_schedule_task_del(SilcSchedule schedule, SilcTask task)
{
if (silc_unlikely(task == SILC_ALL_TASKS)) {
SilcHashTableList htl;
task->valid = FALSE;
SILC_SCHEDULE_UNLOCK(schedule);
- return;
+ return TRUE;
}
SILC_LOG_DEBUG(("Unregistering task %p", task));
SILC_SCHEDULE_LOCK(schedule);
task->valid = FALSE;
SILC_SCHEDULE_UNLOCK(schedule);
+
+ return TRUE;
}
/* Invalidate task by fd */
-void silc_schedule_task_del_by_fd(SilcSchedule schedule, SilcUInt32 fd)
+SilcBool silc_schedule_task_del_by_fd(SilcSchedule schedule, SilcUInt32 fd)
{
SilcTask task = NULL;
+ SilcBool ret = FALSE;
SILC_LOG_DEBUG(("Unregister task by fd %d", fd));
(void **)&task))) {
SILC_LOG_DEBUG(("Deleting task %p", task));
task->valid = FALSE;
+ ret = TRUE;
}
SILC_SCHEDULE_UNLOCK(schedule);
/* If it is signal, remove it */
- if (silc_unlikely(!task))
+ if (silc_unlikely(!task)) {
schedule_ops.signal_unregister(schedule, schedule->internal, fd);
+ ret = TRUE;
+ }
+
+ return ret;
}
/* Invalidate task by task callback. */
-void silc_schedule_task_del_by_callback(SilcSchedule schedule,
- SilcTaskCallback callback)
+SilcBool silc_schedule_task_del_by_callback(SilcSchedule schedule,
+ SilcTaskCallback callback)
{
SilcTask task;
SilcHashTableList htl;
SilcList list;
+ SilcBool ret = FALSE;
SILC_LOG_DEBUG(("Unregister task by callback"));
/* Delete from fd queue */
silc_hash_table_list(schedule->fd_queue, &htl);
while (silc_hash_table_get(&htl, NULL, (void **)&task)) {
- if (task->callback == callback)
+ if (task->callback == callback) {
task->valid = FALSE;
+ ret = TRUE;
+ }
}
silc_hash_table_list_reset(&htl);
list = schedule->timeout_queue;
silc_list_start(list);
while ((task = (SilcTask)silc_list_get(list))) {
- if (task->callback == callback)
+ if (task->callback == callback) {
task->valid = FALSE;
+ ret = TRUE;
+ }
}
SILC_SCHEDULE_UNLOCK(schedule);
+
+ return ret;
}
/* Invalidate task by context. */
-void silc_schedule_task_del_by_context(SilcSchedule schedule, void *context)
+SilcBool silc_schedule_task_del_by_context(SilcSchedule schedule,
+ void *context)
{
SilcTask task;
SilcHashTableList htl;
SilcList list;
+ SilcBool ret = FALSE;
SILC_LOG_DEBUG(("Unregister task by context"));
/* Delete from fd queue */
silc_hash_table_list(schedule->fd_queue, &htl);
while (silc_hash_table_get(&htl, NULL, (void **)&task)) {
- if (task->context == context)
+ if (task->context == context) {
task->valid = FALSE;
+ ret = TRUE;
+ }
}
silc_hash_table_list_reset(&htl);
list = schedule->timeout_queue;
silc_list_start(list);
while ((task = (SilcTask)silc_list_get(list))) {
- if (task->context == context)
+ if (task->context == context) {
+ ret = TRUE;
task->valid = FALSE;
+ }
}
SILC_SCHEDULE_UNLOCK(schedule);
+
+ return ret;
}
/* Invalidate task by all */
-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)
{
SilcTask task;
SilcList list;
+ SilcBool ret = FALSE;
SILC_LOG_DEBUG(("Unregister task by fd, callback and context"));
/* For fd task, callback and context is irrelevant as fd is unique */
if (fd)
- silc_schedule_task_del_by_fd(schedule, fd);
+ return silc_schedule_task_del_by_fd(schedule, fd);
SILC_SCHEDULE_LOCK(schedule);
list = schedule->timeout_queue;
silc_list_start(list);
while ((task = (SilcTask)silc_list_get(list))) {
- if (task->callback == callback && task->context == context)
+ if (task->callback == callback && task->context == context) {
task->valid = FALSE;
+ ret = TRUE;
+ }
}
SILC_SCHEDULE_UNLOCK(schedule);
+
+ return TRUE;
}
/* Sets a file descriptor to be listened by scheduler. One can call this
*
* 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
*