use putenv instead of setenv for portability
[oweals/gnunet.git] / src / util / scheduler.c
index 52824d8b343fa7ca48baf45897e90135f2027b0f..0c43744713afd4c814f3279cda4ae800c8c31dfd 100644 (file)
 #include "gnunet_signal_lib.h"
 #include "gnunet_time_lib.h"
 #include "disk.h"
+#define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
+
+#define LOG_STRERROR(kind,syscall) GNUNET_log_from_strerror (kind, "util", syscall)
 #ifdef LINUX
 #include "execinfo.h"
 
 
+
 /**
  * Use lsof to generate file descriptor reports on select error?
  * (turn off for stable releases).
@@ -48,7 +52,7 @@
 /**
  * Check each file descriptor before adding
  */
-#define DEBUG_FDS GNUNET_NO
+#define DEBUG_FDS GNUNET_EXTRA_LOGGING
 
 /**
  * Depth of the traces collected via EXECINFO.
@@ -56,7 +60,7 @@
 #define MAX_TRACE_DEPTH 50
 #endif
 
-#define DEBUG_TASKS GNUNET_NO
+#define DEBUG_TASKS GNUNET_EXTRA_LOGGING
 
 /**
  * Should we figure out which tasks are delayed for a while
@@ -260,6 +264,7 @@ static void *scheduler_select_cls;
  * Sets the select function to use in the scheduler (scheduler_select).
  *
  * @param new_select new select function to use
+ * @param new_select_cls closure for 'new_select'
  * @return previously used select function, NULL for default
  */
 void
@@ -522,9 +527,8 @@ check_ready (const struct GNUNET_NETWORK_FDSet *rs,
   while (pos != NULL)
   {
 #if DEBUG_TASKS
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Checking readiness of task: %llu / %p\n", pos->id,
-                pos->callback_cls);
+    LOG (GNUNET_ERROR_TYPE_DEBUG, "Checking readiness of task: %llu / %p\n",
+         pos->id, pos->callback_cls);
 #endif
     next = pos->next;
     if (GNUNET_YES == is_ready (pos, now, rs, ws))
@@ -613,7 +617,7 @@ destroy_task (struct Task *t)
  * empty.  Keep running tasks until we are either no longer running
  * "URGENT" tasks or until we have at least one "pending" task (which
  * may become ready, hence we should select on it).  Naturally, if
- * there are no more ready tasks, we also return.  
+ * there are no more ready tasks, we also return.
  *
  * @param rs FDs ready for reading
  * @param ws FDs ready for writing
@@ -654,11 +658,10 @@ run_ready (struct GNUNET_NETWORK_FDSet *rs, struct GNUNET_NETWORK_FDSet *ws)
     if (GNUNET_TIME_absolute_get_duration (pos->start_time).rel_value >
         DELAY_THRESHOLD.rel_value)
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  "Task %llu took %llums to be scheduled\n", pos->id,
-                  (unsigned long long)
-                  GNUNET_TIME_absolute_get_duration
-                  (pos->start_time).rel_value);
+      LOG (GNUNET_ERROR_TYPE_ERROR, "Task %llu took %llums to be scheduled\n",
+           pos->id,
+           (unsigned long long)
+           GNUNET_TIME_absolute_get_duration (pos->start_time).rel_value);
     }
 #endif
     tc.reason = pos->reason;
@@ -675,16 +678,16 @@ run_ready (struct GNUNET_NETWORK_FDSet *rs, struct GNUNET_NETWORK_FDSet *ws)
         (!GNUNET_NETWORK_fdset_test_native (ws, pos->write_fd)))
       abort ();                 // added to ready in previous select loop!
 #if DEBUG_TASKS
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Running task: %llu / %p\n", pos->id,
-                pos->callback_cls);
+    LOG (GNUNET_ERROR_TYPE_DEBUG, "Running task: %llu / %p\n", pos->id,
+         pos->callback_cls);
 #endif
     pos->callback (pos->callback_cls, &tc);
 #if EXECINFO
     int i;
 
     for (i = 0; i < pos->num_backtrace_strings; i++)
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Task %llu trace %d: %s\n", pos->id,
-                  i, pos->backtrace_strings[i]);
+      LOG (GNUNET_ERROR_TYPE_ERROR, "Task %llu trace %d: %s\n", pos->id, i,
+           pos->backtrace_strings[i]);
 #endif
     active_task = NULL;
     destroy_task (pos);
@@ -726,7 +729,7 @@ sighandler_shutdown ()
 
 /**
  * Check if the system is still life. Trigger shutdown if we
- * have tasks, but none of them give us lifeness.  
+ * have tasks, but none of them give us lifeness.
  *
  * @return GNUNET_OK to continue the main loop,
  *         GNUNET_NO to exit
@@ -837,7 +840,7 @@ GNUNET_SCHEDULER_run (GNUNET_SCHEDULER_Task task, void *task_cls)
       if (errno == EINTR)
         continue;
 
-      GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "select");
+      LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "select");
 #ifndef MINGW
 #if USE_LSOF
       char lsof[512];
@@ -846,7 +849,7 @@ GNUNET_SCHEDULER_run (GNUNET_SCHEDULER_Task task, void *task_cls)
       (void) close (1);
       (void) dup2 (2, 1);
       if (0 != system (lsof))
-        GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "system");
+        LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "system");
 #endif
 #endif
       abort ();
@@ -854,8 +857,7 @@ GNUNET_SCHEDULER_run (GNUNET_SCHEDULER_Task task, void *task_cls)
     }
     if ((ret == 0) && (timeout.rel_value == 0) && (busy_wait_warning > 16))
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                  _("Looks like we're busy waiting...\n"));
+      LOG (GNUNET_ERROR_TYPE_WARNING, _("Looks like we're busy waiting...\n"));
       sleep (1);                /* mitigate */
     }
     check_ready (rs, ws);
@@ -893,7 +895,7 @@ GNUNET_SCHEDULER_run (GNUNET_SCHEDULER_Task task, void *task_cls)
 
 /**
  * Obtain the reason code for why the current task was
- * started.  Will return the same value as 
+ * started.  Will return the same value as
  * the GNUNET_SCHEDULER_TaskContext's reason field.
  *
  * @return reason(s) why the current task is run
@@ -985,9 +987,8 @@ GNUNET_SCHEDULER_cancel (GNUNET_SCHEDULER_TaskIdentifier task)
     p++;
     if (p >= GNUNET_SCHEDULER_PRIORITY_COUNT)
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  _("Attempt to cancel dead task %llu!\n"),
-                  (unsigned long long) task);
+      LOG (GNUNET_ERROR_TYPE_ERROR, _("Attempt to cancel dead task %llu!\n"),
+           (unsigned long long) task);
       GNUNET_assert (0);
     }
     prev = NULL;
@@ -1027,8 +1028,8 @@ GNUNET_SCHEDULER_cancel (GNUNET_SCHEDULER_TaskIdentifier task)
   }
   ret = t->callback_cls;
 #if DEBUG_TASKS
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Canceling task: %llu / %p\n", task,
-              t->callback_cls);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Canceling task: %llu / %p\n", task,
+       t->callback_cls);
 #endif
   destroy_task (t);
   return ret;
@@ -1075,8 +1076,8 @@ GNUNET_SCHEDULER_add_continuation (GNUNET_SCHEDULER_Task task, void *task_cls,
   t->priority = current_priority;
   t->lifeness = current_lifeness;
 #if DEBUG_TASKS
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding continuation task: %llu / %p\n",
-              t->id, t->callback_cls);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Adding continuation task: %llu / %p\n", t->id,
+       t->callback_cls);
 #endif
   queue_ready_task (t);
 }
@@ -1134,7 +1135,7 @@ GNUNET_SCHEDULER_add_with_priority (enum GNUNET_SCHEDULER_Priority prio,
  * will be scheduled for execution once the delay has expired. It
  * will be run with the priority of the calling task.
  *
- * @param delay when should this operation time out? Use 
+ * @param delay when should this operation time out? Use
  *        GNUNET_TIME_UNIT_FOREVER_REL for "on shutdown"
  * @param task main function of the task
  * @param task_cls closure of task
@@ -1205,15 +1206,15 @@ GNUNET_SCHEDULER_add_delayed (struct GNUNET_TIME_Relative delay,
   pending_timeout_last = t;
 
 #if DEBUG_TASKS
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding task: %llu / %p\n", t->id,
-              t->callback_cls);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Adding task: %llu / %p\n", t->id,
+       t->callback_cls);
 #endif
 #if EXECINFO
   int i;
 
   for (i = 0; i < t->num_backtrace_strings; i++)
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Task %llu trace %d: %s\n", t->id, i,
-                t->backtrace_strings[i]);
+    LOG (GNUNET_ERROR_TYPE_DEBUG, "Task %llu trace %d: %s\n", t->id, i,
+         t->backtrace_strings[i]);
 #endif
   return t->id;
 
@@ -1332,16 +1333,14 @@ add_without_sets (struct GNUNET_TIME_Relative delay, int rfd, int wfd,
   {
     int flags = fcntl (rfd, F_GETFD);
 
-    if (flags == -1 && errno == EBADF)
+    if ((flags == -1) && (errno == EBADF))
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Got invalid file descriptor %d!\n",
-                  rfd);
+      LOG (GNUNET_ERROR_TYPE_ERROR, "Got invalid file descriptor %d!\n", rfd);
 #if EXECINFO
       int i;
 
       for (i = 0; i < t->num_backtrace_strings; i++)
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Trace: %s\n",
-                    t->backtrace_strings[i]);
+        LOG (GNUNET_ERROR_TYPE_DEBUG, "Trace: %s\n", t->backtrace_strings[i]);
 #endif
       GNUNET_assert (0);
     }
@@ -1352,14 +1351,12 @@ add_without_sets (struct GNUNET_TIME_Relative delay, int rfd, int wfd,
 
     if (flags == -1 && errno == EBADF)
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Got invalid file descriptor %d!\n",
-                  wfd);
+      LOG (GNUNET_ERROR_TYPE_ERROR, "Got invalid file descriptor %d!\n", wfd);
 #if EXECINFO
       int i;
 
       for (i = 0; i < t->num_backtrace_strings; i++)
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Trace: %s\n",
-                    t->backtrace_strings[i]);
+        LOG (GNUNET_ERROR_TYPE_DEBUG, "Trace: %s\n", t->backtrace_strings[i]);
 #endif
       GNUNET_assert (0);
     }
@@ -1380,15 +1377,15 @@ add_without_sets (struct GNUNET_TIME_Relative delay, int rfd, int wfd,
   pending = t;
   max_priority_added = GNUNET_MAX (max_priority_added, t->priority);
 #if DEBUG_TASKS
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding task: %llu / %p\n", t->id,
-              t->callback_cls);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Adding task: %llu / %p\n", t->id,
+       t->callback_cls);
 #endif
 #if EXECINFO
   int i;
 
   for (i = 0; i < t->num_backtrace_strings; i++)
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Task %llu trace %d: %s\n", t->id, i,
-                t->backtrace_strings[i]);
+    LOG (GNUNET_ERROR_TYPE_DEBUG, "Task %llu trace %d: %s\n", t->id, i,
+         t->backtrace_strings[i]);
 #endif
   return t->id;
 }
@@ -1404,7 +1401,7 @@ add_without_sets (struct GNUNET_TIME_Relative delay, int rfd, int wfd,
  * socket operation is ready.  It will be run with the priority of
  * the calling task.
  *
- * @param delay when should this operation time out? Use 
+ * @param delay when should this operation time out? Use
  *        GNUNET_TIME_UNIT_FOREVER_REL for "on shutdown"
  * @param rfd read file-descriptor
  * @param task main function of the task
@@ -1445,7 +1442,7 @@ GNUNET_SCHEDULER_add_read_net (struct GNUNET_TIME_Relative delay,
  * socket operation is ready.  It will be run with the priority of
  * the calling task.
  *
- * @param delay when should this operation time out? Use 
+ * @param delay when should this operation time out? Use
  *        GNUNET_TIME_UNIT_FOREVER_REL for "on shutdown"
  * @param wfd write file-descriptor
  * @param task main function of the task
@@ -1487,7 +1484,7 @@ GNUNET_SCHEDULER_add_write_net (struct GNUNET_TIME_Relative delay,
  * socket operation is ready. It will be run with the priority of
  * the calling task.
  *
- * @param delay when should this operation time out? Use 
+ * @param delay when should this operation time out? Use
  *        GNUNET_TIME_UNIT_FOREVER_REL for "on shutdown"
  * @param rfd read file-descriptor
  * @param task main function of the task
@@ -1531,7 +1528,7 @@ GNUNET_SCHEDULER_add_read_file (struct GNUNET_TIME_Relative delay,
  * socket operation is ready. It will be run with the priority of
  * the calling task.
  *
- * @param delay when should this operation time out? Use 
+ * @param delay when should this operation time out? Use
  *        GNUNET_TIME_UNIT_FOREVER_REL for "on shutdown"
  * @param wfd write file-descriptor
  * @param task main function of the task
@@ -1652,15 +1649,15 @@ GNUNET_SCHEDULER_add_select (enum GNUNET_SCHEDULER_Priority prio,
   pending = t;
   max_priority_added = GNUNET_MAX (max_priority_added, t->priority);
 #if DEBUG_TASKS
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding task: %llu / %p\n", t->id,
-              t->callback_cls);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Adding task: %llu / %p\n", t->id,
+       t->callback_cls);
 #endif
 #if EXECINFO
   int i;
 
   for (i = 0; i < t->num_backtrace_strings; i++)
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Task %llu trace %d: %s\n", t->id, i,
-                t->backtrace_strings[i]);
+    LOG (GNUNET_ERROR_TYPE_DEBUG, "Task %llu trace %d: %s\n", t->id, i,
+         t->backtrace_strings[i]);
 #endif
   return t->id;
 }