asserts
[oweals/gnunet.git] / src / util / scheduler.c
index ae257e6f45f15bfd02d6a8578d85364a87704551..c46c895009e565f247de1efbbda22cf9a2cdf8cf 100644 (file)
  */
 #include "platform.h"
 #include "gnunet_common.h"
+#include "gnunet_os_lib.h"
 #include "gnunet_scheduler_lib.h"
 #include "gnunet_signal_lib.h"
 #include "gnunet_time_lib.h"
 #ifdef LINUX
 #include "execinfo.h"
-#define EXECINFO GNUNET_YES
-#endif
-
 #define EXECINFO GNUNET_NO
+#define MAX_TRACE_DEPTH 50
+#endif
 
 #define DEBUG_TASKS GNUNET_NO
 
@@ -168,6 +168,11 @@ struct GNUNET_SCHEDULER_Handle
    */
   enum GNUNET_SCHEDULER_Priority current_priority;
 
+  /**
+   * How 'nice' are we right now?
+   */
+  int nice_level;
+
 };
 
 
@@ -457,7 +462,7 @@ destroy_task (struct Task *t)
     GNUNET_NETWORK_fdset_destroy (t->read_set);
   if (NULL != t->write_set)
     GNUNET_NETWORK_fdset_destroy (t->write_set);
-#ifdef EXECINFO
+#if EXECINFO
   GNUNET_free (t->backtrace_strings);
 #endif
   GNUNET_free (t);
@@ -496,7 +501,11 @@ run_ready (struct GNUNET_SCHEDULER_Handle *sched)
       GNUNET_assert (pos != NULL);      /* ready_count wrong? */
       sched->ready[p] = pos->next;
       sched->ready_count--;
-      sched->current_priority = pos->priority;
+      if (sched->current_priority != pos->priority)
+       {
+         sched->current_priority = pos->priority;
+         (void) GNUNET_OS_set_process_priority (0, pos->priority);
+       }
       sched->active_task = pos;
       tc.sched = sched;
       tc.reason = pos->reason;
@@ -771,11 +780,11 @@ GNUNET_SCHEDULER_add_continuation (struct GNUNET_SCHEDULER_Handle *sched,
                                    enum GNUNET_SCHEDULER_Reason reason)
 {
   struct Task *t;
-#ifdef EXECINFO
+#if EXECINFO
   void *backtrace_array[50];
 #endif
   t = GNUNET_malloc (sizeof (struct Task));
-#ifdef EXECINFO
+#if EXECINFO
   t->num_backtrace_strings = backtrace(backtrace_array, 50);
   t->backtrace_strings = backtrace_symbols(backtrace_array, t->num_backtrace_strings);
 #endif
@@ -1096,14 +1105,16 @@ GNUNET_SCHEDULER_add_select (struct GNUNET_SCHEDULER_Handle * sched,
                              GNUNET_SCHEDULER_Task task, void *task_cls)
 {
   struct Task *t;
-#ifdef EXECINFO
-  void *backtrace_array[50];
+#if EXECINFO
+  void *backtrace_array[MAX_TRACE_DEPTH];
 #endif
+
+  GNUNET_assert (NULL != task);
   t = GNUNET_malloc (sizeof (struct Task));
   t->callback = task;
   t->callback_cls = task_cls;
-#ifdef EXECINFO
-  t->num_backtrace_strings = backtrace(backtrace_array, 50);
+#if EXECINFO
+  t->num_backtrace_strings = backtrace(backtrace_array, MAX_TRACE_DEPTH);
   t->backtrace_strings = backtrace_symbols(backtrace_array, t->num_backtrace_strings);
 #endif
   if (rs != NULL)