gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r25669 - gnunet/src/testbed


From: gnunet
Subject: [GNUnet-SVN] r25669 - gnunet/src/testbed
Date: Tue, 1 Jan 2013 23:43:24 +0100

Author: harsha
Date: 2013-01-01 23:43:24 +0100 (Tue, 01 Jan 2013)
New Revision: 25669

Modified:
   gnunet/src/testbed/test_testbed_api_operations.c
   gnunet/src/testbed/testbed_api_operations.c
Log:
- make operations wait when max_active is decreased

Modified: gnunet/src/testbed/test_testbed_api_operations.c
===================================================================
--- gnunet/src/testbed/test_testbed_api_operations.c    2013-01-01 11:49:41 UTC 
(rev 25668)
+++ gnunet/src/testbed/test_testbed_api_operations.c    2013-01-01 22:43:24 UTC 
(rev 25669)
@@ -88,6 +88,12 @@
      */
   TEST_OP1_RELEASED,
 
+  /**
+   * Temporary pause where no operations should start as we set max active in 
q1
+   * to 0 in stage TEST_OP1_STARTED
+   */
+  TEST_PAUSE,
+
     /**
      * op2 has started
      */
@@ -99,12 +105,6 @@
   TEST_OP2_RELEASED,
 
   /**
-   * Temporary pause where no operations should start as we set max active in 
q1
-   * to 0
-   */
-  TEST_PAUSE,
-
-  /**
    * op3 has started
    */
   TEST_OP3_STARTED,
@@ -164,13 +164,13 @@
     GNUNET_TESTBED_operation_queue_insert_ (q2, op3);
     GNUNET_TESTBED_operation_begin_wait_ (op3);
     break;
+  case TEST_OP1_RELEASED:
+    result = TEST_PAUSE;
+    GNUNET_TESTBED_operation_queue_reset_max_active_ (q1, 1);
+    break;
   case TEST_OP2_STARTED:
     GNUNET_TESTBED_operation_release_ (op2);
     break;
-  case TEST_OP2_RELEASED:
-    result = TEST_PAUSE;
-    GNUNET_TESTBED_operation_queue_reset_max_active_ (q1, 1);
-    break;
   case TEST_OP3_STARTED:
     GNUNET_TESTBED_operation_release_ (op3);
     break;
@@ -196,13 +196,13 @@
     GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
     step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, 
NULL);
     break;
-  case TEST_OP1_RELEASED:
+  case TEST_PAUSE:
     GNUNET_assert (&op2 == cls);
     result = TEST_OP2_STARTED;
     GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
     step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, 
NULL);
     break;
-  case TEST_PAUSE:
+  case TEST_OP2_RELEASED:
     GNUNET_assert (&op3 == cls);
     result = TEST_OP3_STARTED;
     GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
@@ -232,13 +232,14 @@
     GNUNET_assert (&op1 == cls);
     result = TEST_OP1_RELEASED;
     op1 = NULL;
-    //GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL);
+    step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step,
+                                              NULL);
     break;
   case TEST_OP2_STARTED:
     GNUNET_assert (&op2 == cls);
     result = TEST_OP2_RELEASED;
     GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
-    step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, 
NULL);
+    //step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, 
&step, NULL);
     break;
   case TEST_OP3_STARTED:
     GNUNET_assert (&op3 == cls);

Modified: gnunet/src/testbed/testbed_api_operations.c
===================================================================
--- gnunet/src/testbed/testbed_api_operations.c 2013-01-01 11:49:41 UTC (rev 
25668)
+++ gnunet/src/testbed/testbed_api_operations.c 2013-01-01 22:43:24 UTC (rev 
25669)
@@ -189,6 +189,26 @@
 
 
 /**
+ * Defers a ready to be executed operation back to waiting
+ *
+ * @param op the operation to defer
+ */
+static void
+defer (struct GNUNET_TESTBED_Operation *op)
+{
+  unsigned int i;
+
+  GNUNET_assert (OP_STATE_READY == op->state);
+  GNUNET_assert (GNUNET_SCHEDULER_NO_TASK != op->start_task_id);
+  GNUNET_SCHEDULER_cancel (op->start_task_id);
+  op->start_task_id = GNUNET_SCHEDULER_NO_TASK;
+  for (i = 0; i < op->nqueues; i++)
+    op->queues[i]->active--;
+  op->state = OP_STATE_WAITING;
+}
+
+
+/**
  * Create an 'operation' to be performed.
  *
  * @param cls closure for the callbacks
@@ -260,9 +280,19 @@
   struct QueueEntry *entry;
   
   queue->max_active = max_active;
-  if (queue->active >= queue->max_active)
-    return;
+  /* if (queue->active >= queue->max_active) */
+  /*   return; */
+
   entry = queue->head;
+  while ( (queue->active > queue->max_active) &&
+          (NULL != entry))
+  {
+    if (entry->op->state == OP_STATE_READY)
+      defer (entry->op);
+    entry = entry->next;
+  }
+
+  entry = queue->head;
   while ( (NULL != entry) &&
           (queue->active < queue->max_active) )
   {
@@ -336,10 +366,16 @@
     if (entry->op == operation)
       break;
   GNUNET_assert (NULL != entry);
-  if (OP_STATE_STARTED == operation->state)
+  switch (operation->state)
   {
+  case OP_STATE_INIT:
+  case OP_STATE_WAITING:
+    break;
+  case OP_STATE_READY:
+  case OP_STATE_STARTED:
     GNUNET_assert (0 != queue->active);
     queue->active--;
+    break;
   }
   entry2 = entry->next;
   GNUNET_CONTAINER_DLL_remove (queue->head, queue->tail, entry);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]