updates.
[silc.git] / lib / silcutil / silcschedule.c
index d3833af1aaf23f006586418dc436937f4390845b..4084371e9a76dd11573a7c851aa661ab33d5e23c 100644 (file)
@@ -200,6 +200,9 @@ SilcSchedule silc_schedule_init(int max_tasks)
   silc_task_queue_alloc(&schedule->timeout_queue);
   silc_task_queue_alloc(&schedule->generic_queue);
 
+  if (!max_tasks)
+    max_tasks = 200;
+
   /* Initialize the scheduler */
   schedule->fd_list = silc_calloc(max_tasks, sizeof(*schedule->fd_list));
   schedule->max_fd = max_tasks;
@@ -247,6 +250,20 @@ bool silc_schedule_uninit(SilcSchedule schedule)
   return TRUE;
 }
 
+/* Enlarge the capabilities of the scheduler to handle tasks to `max_tasks'. */
+
+bool silc_schedule_reinit(SilcSchedule schedule, int max_tasks)
+{
+  silc_mutex_lock(schedule->lock);
+  if (schedule->max_fd <= max_tasks)
+    return FALSE;
+  schedule->fd_list = silc_realloc(schedule->fd_list, 
+                                  (sizeof(*schedule->fd_list) * max_tasks));
+  schedule->max_fd = max_tasks;
+  silc_mutex_unlock(schedule->lock);
+  return TRUE;
+}
+
 /* Stops the schedule even if it is not supposed to be stopped yet. 
    After calling this, one should call silc_schedule_uninit (after the 
    silc_schedule has returned). */
@@ -254,9 +271,7 @@ bool silc_schedule_uninit(SilcSchedule schedule)
 void silc_schedule_stop(SilcSchedule schedule)
 {
   SILC_LOG_DEBUG(("Stopping scheduler"));
-  silc_mutex_lock(schedule->lock);
   schedule->valid = FALSE;
-  silc_mutex_unlock(schedule->lock);
 }
 
 /* Executes nontimeout tasks. It then checks whether any of ther fd tasks
@@ -744,7 +759,7 @@ void silc_schedule_task_del(SilcSchedule schedule, SilcTask task)
 
 void silc_schedule_task_del_by_fd(SilcSchedule schedule, uint32 fd)
 {
-  SILC_LOG_DEBUG(("Unregister task by fd"));
+  SILC_LOG_DEBUG(("Unregister task by fd %d", fd));
 
   silc_task_del_by_fd(schedule->timeout_queue, fd);
   silc_task_del_by_fd(schedule->fd_queue, fd);
@@ -816,6 +831,8 @@ void silc_schedule_unset_listen_fd(SilcSchedule schedule, uint32 fd)
 
   silc_mutex_lock(schedule->lock);
 
+  SILC_LOG_DEBUG(("Unset listen fd %d", fd));
+
   for (i = 0; i < schedule->max_fd; i++)
     if (schedule->fd_list[i].fd == fd) {
       schedule->fd_list[i].fd = 0;