Merge branch 'getopt'
[oweals/gnunet.git] / src / util / test_scheduler.c
index 3021dce19fc8ecb388a1f62353ebdea0da360fa1..55d4c7137e5366e662f2d52a0703665cfd714435 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet.
 /*
      This file is part of GNUnet.
-     (C) 2009 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2009 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 /**
  * @file util/test_scheduler.c
  * @brief tests for the scheduler
  */
 #include "platform.h"
 */
 /**
  * @file util/test_scheduler.c
  * @brief tests for the scheduler
  */
 #include "platform.h"
-#include "gnunet_common.h"
-#include "gnunet_scheduler_lib.h"
-#include "gnunet_time_lib.h"
-#include "gnunet_disk_lib.h"
+#include "gnunet_util_lib.h"
 
 
-#define VERBOSE GNUNET_NO
 
 
-static void
-task3 (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
-{
-  int *ok = cls;
-  /* t4 should be ready (albeit with lower priority) */
-  GNUNET_assert (1 == GNUNET_SCHEDULER_get_load (tc->sched,
-                                                 GNUNET_SCHEDULER_PRIORITY_COUNT));
-  GNUNET_assert (3 == *ok);
-  (*ok) = 4;
-}
+static struct GNUNET_DISK_PipeHandle *p;
+
+static const struct GNUNET_DISK_FileHandle *fds[2];
 
 
 static void
 
 
 static void
-task2 (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+task2 (void *cls)
 {
   int *ok = cls;
 {
   int *ok = cls;
+
+  /* t3 should be ready (albeit with lower priority) */
+  GNUNET_assert (1 ==
+                 GNUNET_SCHEDULER_get_load (GNUNET_SCHEDULER_PRIORITY_COUNT));
   GNUNET_assert (2 == *ok);
   (*ok) = 3;
   GNUNET_assert (2 == *ok);
   (*ok) = 3;
-  /* t3 will go before t4: higher priority */
-  GNUNET_SCHEDULER_add_with_priority (tc->sched,                                 
-                                     GNUNET_SCHEDULER_PRIORITY_UI,
-                                     &task3, cls);
 }
 
 }
 
+
 static void
 static void
-task4 (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+task3 (void *cls)
 {
   int *ok = cls;
 {
   int *ok = cls;
-  GNUNET_assert (4 == *ok);
-  (*ok) = 5;
-}
 
 
-struct GNUNET_DISK_PipeHandle *p;
-static const struct GNUNET_DISK_FileHandle *fds[2];
+  GNUNET_assert (3 == *ok);
+  (*ok) = 4;
+}
 
 
 static void
 
 
 static void
-taskWrt (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+taskWrt (void *cls)
 {
   static char c;
   int *ok = cls;
 {
   static char c;
   int *ok = cls;
+  const struct GNUNET_SCHEDULER_TaskContext *tc;
+
+  tc = GNUNET_SCHEDULER_get_task_context ();
   GNUNET_assert (6 == *ok);
   GNUNET_assert (GNUNET_NETWORK_fdset_handle_isset (tc->write_ready, fds[1]));
   (*ok) = 7;
   GNUNET_assert (6 == *ok);
   GNUNET_assert (GNUNET_NETWORK_fdset_handle_isset (tc->write_ready, fds[1]));
   (*ok) = 7;
@@ -78,77 +69,79 @@ taskWrt (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 
 
 static void
 
 
 static void
-taskNeverRun (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+taskNeverRun (void *cls)
 {
   GNUNET_assert (0);
 }
 
 {
   GNUNET_assert (0);
 }
 
+
 static void
 static void
-taskLast (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+taskLast (void *cls)
 {
   int *ok = cls;
 {
   int *ok = cls;
-  /* t4 should be ready (albeit with lower priority) */
+
   GNUNET_assert (8 == *ok);
   (*ok) = 0;
 }
 
   GNUNET_assert (8 == *ok);
   (*ok) = 0;
 }
 
+
 static void
 static void
-taskRd (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+taskRd (void *cls)
 {
   static char c;
   int *ok = cls;
 {
   static char c;
   int *ok = cls;
+  const struct GNUNET_SCHEDULER_TaskContext *tc;
+
+  tc = GNUNET_SCHEDULER_get_task_context ();
   GNUNET_assert (7 == *ok);
   GNUNET_assert (GNUNET_NETWORK_fdset_handle_isset (tc->read_ready, fds[0]));
   GNUNET_assert (1 == GNUNET_DISK_file_read (fds[0], &c, 1));
   (*ok) = 8;
   GNUNET_assert (7 == *ok);
   GNUNET_assert (GNUNET_NETWORK_fdset_handle_isset (tc->read_ready, fds[0]));
   GNUNET_assert (1 == GNUNET_DISK_file_read (fds[0], &c, 1));
   (*ok) = 8;
-  GNUNET_SCHEDULER_add_with_priority (tc->sched,
-                                     GNUNET_SCHEDULER_PRIORITY_IDLE,
-                                     &taskLast, cls);
-  GNUNET_SCHEDULER_shutdown (tc->sched);
+  GNUNET_SCHEDULER_add_shutdown (&taskLast,
+                                cls);
+  GNUNET_SCHEDULER_shutdown ();
 }
 
 
 static void
 }
 
 
 static void
-task5 (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+task4 (void *cls)
 {
   int *ok = cls;
 {
   int *ok = cls;
-  GNUNET_assert (5 == *ok);
+
+  GNUNET_assert (4 == *ok);
   (*ok) = 6;
   (*ok) = 6;
-  p = GNUNET_DISK_pipe (GNUNET_NO);
+  p = GNUNET_DISK_pipe (GNUNET_NO, GNUNET_NO, GNUNET_NO, GNUNET_NO);
   GNUNET_assert (NULL != p);
   fds[0] = GNUNET_DISK_pipe_handle (p, GNUNET_DISK_PIPE_END_READ);
   fds[1] = GNUNET_DISK_pipe_handle (p, GNUNET_DISK_PIPE_END_WRITE);
   GNUNET_assert (NULL != p);
   fds[0] = GNUNET_DISK_pipe_handle (p, GNUNET_DISK_PIPE_END_READ);
   fds[1] = GNUNET_DISK_pipe_handle (p, GNUNET_DISK_PIPE_END_WRITE);
-  GNUNET_SCHEDULER_add_read_file (tc->sched,
-                                  GNUNET_TIME_UNIT_FOREVER_REL,
-                                  fds[0], &taskRd, cls);
-  GNUNET_SCHEDULER_add_write_file (tc->sched,
-                                   GNUNET_TIME_UNIT_FOREVER_REL,
-                                   fds[1], &taskWrt, cls);
+  GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
+                                 fds[0],
+                                 &taskRd,
+                                  cls);
+  GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
+                                  fds[1],
+                                   &taskWrt,
+                                  cls);
 }
 
 
 static void
 }
 
 
 static void
-task1 (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+task1 (void *cls)
 {
   int *ok = cls;
 {
   int *ok = cls;
-  GNUNET_SCHEDULER_TaskIdentifier t2;
-  GNUNET_SCHEDULER_TaskIdentifier t4;
 
   GNUNET_assert (1 == *ok);
   (*ok) = 2;
 
   GNUNET_assert (1 == *ok);
   (*ok) = 2;
-  /* t2 will go first -- prereq for all */
-  t2 = GNUNET_SCHEDULER_add_after (tc->sched,
-                                   GNUNET_SCHEDULER_NO_TASK, &task2, cls);
-  /* t4 will go after t2 ('add after') and after t3 (priority) */
-  t4 = GNUNET_SCHEDULER_add_after (tc->sched,
-                                   t2, &task4, cls);
-  /* t5 will go last (after p4) */
-  GNUNET_SCHEDULER_add_after (tc->sched,
-                              t4, &task5, cls);
+  GNUNET_SCHEDULER_add_now (&task3, cls);
+  GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_UI,
+                                     &task2,
+                                      cls);
+  GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
+                               &task4,
+                               cls);
 }
 
 
 }
 
 
-
 /**
  * Main method, starts scheduler with task1,
  * checks that "ok" is correct at the end.
 /**
  * Main method, starts scheduler with task1,
  * checks that "ok" is correct at the end.
@@ -165,15 +158,14 @@ check ()
 
 
 static void
 
 
 static void
-taskShutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+taskShutdown (void *cls)
 {
   int *ok = cls;
 {
   int *ok = cls;
+
   GNUNET_assert (1 == *ok);
   *ok = 8;
   GNUNET_assert (1 == *ok);
   *ok = 8;
-  GNUNET_SCHEDULER_add_delayed (tc->sched,
-                               GNUNET_TIME_UNIT_FOREVER_REL,
-                               &taskLast, cls);
-  GNUNET_SCHEDULER_shutdown (tc->sched);
+  GNUNET_SCHEDULER_add_shutdown (&taskLast, cls);
+  GNUNET_SCHEDULER_shutdown ();
 }
 
 
 }
 
 
@@ -192,20 +184,17 @@ checkShutdown ()
 }
 
 
 }
 
 
+#ifndef MINGW
 static void
 static void
-taskSig (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+taskSig (void *cls)
 {
   int *ok = cls;
 {
   int *ok = cls;
+
   GNUNET_assert (1 == *ok);
   *ok = 8;
   GNUNET_assert (1 == *ok);
   *ok = 8;
-  GNUNET_SCHEDULER_add_delayed (tc->sched,
-                               GNUNET_TIME_UNIT_FOREVER_REL,
-                               &taskLast, cls);
-#ifndef MINGW
-  GNUNET_break (0 == PLIBC_KILL (getpid (), SIGTERM));
-#else
-  GNUNET_SCHEDULER_shutdown (tc->sched);
-#endif
+  GNUNET_SCHEDULER_add_shutdown (&taskLast, cls);
+  GNUNET_break (0 == PLIBC_KILL (getpid (),
+                                GNUNET_TERM_SIG));
 }
 
 
 }
 
 
@@ -222,19 +211,17 @@ checkSignal ()
   GNUNET_SCHEDULER_run (&taskSig, &ok);
   return ok;
 }
   GNUNET_SCHEDULER_run (&taskSig, &ok);
   return ok;
 }
+#endif
 
 
 static void
 
 
 static void
-taskCancel (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+taskCancel (void *cls)
 {
   int *ok = cls;
 
   GNUNET_assert (1 == *ok);
   *ok = 0;
 {
   int *ok = cls;
 
   GNUNET_assert (1 == *ok);
   *ok = 0;
-  GNUNET_SCHEDULER_cancel (tc->sched,
-                           GNUNET_SCHEDULER_add_after (tc->sched,
-                                                       GNUNET_SCHEDULER_NO_TASK,
-                                                       &taskNeverRun, NULL));
+  GNUNET_SCHEDULER_cancel (GNUNET_SCHEDULER_add_now (&taskNeverRun, NULL));
 }
 
 
 }
 
 
@@ -253,7 +240,6 @@ checkCancel ()
 }
 
 
 }
 
 
-
 int
 main (int argc, char *argv[])
 {
 int
 main (int argc, char *argv[])
 {
@@ -261,7 +247,9 @@ main (int argc, char *argv[])
 
   GNUNET_log_setup ("test_scheduler", "WARNING", NULL);
   ret += check ();
 
   GNUNET_log_setup ("test_scheduler", "WARNING", NULL);
   ret += check ();
+#ifndef MINGW
   ret += checkSignal ();
   ret += checkSignal ();
+#endif
   ret += checkShutdown ();
   ret += checkCancel ();
   GNUNET_DISK_pipe_close (p);
   ret += checkShutdown ();
   ret += checkCancel ();
   GNUNET_DISK_pipe_close (p);