no valgrind
[oweals/gnunet.git] / src / experimentation / gnunet-daemon-experimentation_scheduler.c
index 478813cf715b7a7f460236512fdf24db4f419382..39b5415747b994176d84099ae37f7578527f030c 100644 (file)
 #include "gnunet_statistics_service.h"
 #include "gnunet-daemon-experimentation.h"
 
+struct ScheduledExperiment {
+       struct ScheduledExperiment *next;
+       struct ScheduledExperiment *prev;
+
+       struct Experiment *e;
+       GNUNET_SCHEDULER_TaskIdentifier task;
+};
+
+struct ScheduledExperiment *list_head;
+struct ScheduledExperiment *list_tail;
+
+
+static void run (void *cls,const struct GNUNET_SCHEDULER_TaskContext* tc)
+{
+       struct ScheduledExperiment *se = cls;
+       //struct GNUNET_TIME_Relative end;
+       se->task = GNUNET_SCHEDULER_NO_TASK;
+
+       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Running `%s'\n", se->e->name);
+
+//     end = GNUNET_TIME_absolute_get_remaining(se->e->stop);
+//     if (0 < end.rel_value)
+//                     return; /* End of experiment is reached */
+
+//GNUNET_break (0);
+       se->task = GNUNET_SCHEDULER_add_delayed (se->e->frequency, &run, se);
+}
+
+/**
+ * Start the scheduler component
+ */
+void
+GNUNET_EXPERIMENTATION_scheduler_add (struct Experiment *e)
+{
+       struct ScheduledExperiment *se;
+       struct GNUNET_TIME_Relative start;
+       struct GNUNET_TIME_Relative end;
+
+       start = GNUNET_TIME_absolute_get_remaining(e->start);
+       end = GNUNET_TIME_absolute_get_remaining(e->stop);
+
+       if (0 == end.rel_value)
+                       return; /* End of experiment is reached */
+
+       se = GNUNET_malloc (sizeof (struct ScheduledExperiment));
+       se->e = e;
+       if (0 == start.rel_value)
+                       se->task = GNUNET_SCHEDULER_add_now (&run, se);
+       else
+                       se->task = GNUNET_SCHEDULER_add_delayed (start, &run, se);
+
+       GNUNET_CONTAINER_DLL_insert (list_head, list_tail, se);
+       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Scheduled `%s'\n", e->name);
+}
 
 /**
  * Start the scheduler component
@@ -48,7 +102,21 @@ GNUNET_EXPERIMENTATION_scheduler_start ()
 void
 GNUNET_EXPERIMENTATION_scheduler_stop ()
 {
+       struct ScheduledExperiment *cur;
+       struct ScheduledExperiment *next;
 
+       next = list_head;
+       while (NULL != (cur = next))
+       {
+                       next = cur->next;
+                       GNUNET_CONTAINER_DLL_remove (list_head, list_tail, cur);
+                       if (GNUNET_SCHEDULER_NO_TASK != cur->task)
+                       {
+                                       GNUNET_SCHEDULER_cancel (cur->task);
+                                       cur->task = GNUNET_SCHEDULER_NO_TASK;
+                       }
+                       GNUNET_free (cur);
+       }
 }
 
 /* end of gnunet-daemon-experimentation_scheduler.c */