aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2013-01-01 22:43:24 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2013-01-01 22:43:24 +0000
commit5200c6d68ff70c484c480794e5debbc50b62e2aa (patch)
treebe43708e648a31833b88d12015ba5e3383e09ba1 /src
parented8bae1885d78ce9d91bf742e0a8080a7e922b76 (diff)
downloadgnunet-5200c6d68ff70c484c480794e5debbc50b62e2aa.tar.gz
gnunet-5200c6d68ff70c484c480794e5debbc50b62e2aa.zip
- make operations wait when max_active is decreased
Diffstat (limited to 'src')
-rw-r--r--src/testbed/test_testbed_api_operations.c29
-rw-r--r--src/testbed/testbed_api_operations.c42
2 files changed, 54 insertions, 17 deletions
diff --git a/src/testbed/test_testbed_api_operations.c b/src/testbed/test_testbed_api_operations.c
index 92bf12983..cccaac4d0 100644
--- a/src/testbed/test_testbed_api_operations.c
+++ b/src/testbed/test_testbed_api_operations.c
@@ -88,6 +88,12 @@ enum Test
88 */ 88 */
89 TEST_OP1_RELEASED, 89 TEST_OP1_RELEASED,
90 90
91 /**
92 * Temporary pause where no operations should start as we set max active in q1
93 * to 0 in stage TEST_OP1_STARTED
94 */
95 TEST_PAUSE,
96
91 /** 97 /**
92 * op2 has started 98 * op2 has started
93 */ 99 */
@@ -99,12 +105,6 @@ enum Test
99 TEST_OP2_RELEASED, 105 TEST_OP2_RELEASED,
100 106
101 /** 107 /**
102 * Temporary pause where no operations should start as we set max active in q1
103 * to 0
104 */
105 TEST_PAUSE,
106
107 /**
108 * op3 has started 108 * op3 has started
109 */ 109 */
110 TEST_OP3_STARTED, 110 TEST_OP3_STARTED,
@@ -164,13 +164,13 @@ step (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
164 GNUNET_TESTBED_operation_queue_insert_ (q2, op3); 164 GNUNET_TESTBED_operation_queue_insert_ (q2, op3);
165 GNUNET_TESTBED_operation_begin_wait_ (op3); 165 GNUNET_TESTBED_operation_begin_wait_ (op3);
166 break; 166 break;
167 case TEST_OP2_STARTED: 167 case TEST_OP1_RELEASED:
168 GNUNET_TESTBED_operation_release_ (op2);
169 break;
170 case TEST_OP2_RELEASED:
171 result = TEST_PAUSE; 168 result = TEST_PAUSE;
172 GNUNET_TESTBED_operation_queue_reset_max_active_ (q1, 1); 169 GNUNET_TESTBED_operation_queue_reset_max_active_ (q1, 1);
173 break; 170 break;
171 case TEST_OP2_STARTED:
172 GNUNET_TESTBED_operation_release_ (op2);
173 break;
174 case TEST_OP3_STARTED: 174 case TEST_OP3_STARTED:
175 GNUNET_TESTBED_operation_release_ (op3); 175 GNUNET_TESTBED_operation_release_ (op3);
176 break; 176 break;
@@ -196,13 +196,13 @@ start_cb (void *cls)
196 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); 196 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
197 step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL); 197 step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL);
198 break; 198 break;
199 case TEST_OP1_RELEASED: 199 case TEST_PAUSE:
200 GNUNET_assert (&op2 == cls); 200 GNUNET_assert (&op2 == cls);
201 result = TEST_OP2_STARTED; 201 result = TEST_OP2_STARTED;
202 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); 202 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
203 step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL); 203 step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL);
204 break; 204 break;
205 case TEST_PAUSE: 205 case TEST_OP2_RELEASED:
206 GNUNET_assert (&op3 == cls); 206 GNUNET_assert (&op3 == cls);
207 result = TEST_OP3_STARTED; 207 result = TEST_OP3_STARTED;
208 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); 208 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
@@ -232,13 +232,14 @@ release_cb (void *cls)
232 GNUNET_assert (&op1 == cls); 232 GNUNET_assert (&op1 == cls);
233 result = TEST_OP1_RELEASED; 233 result = TEST_OP1_RELEASED;
234 op1 = NULL; 234 op1 = NULL;
235 //GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL); 235 step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step,
236 NULL);
236 break; 237 break;
237 case TEST_OP2_STARTED: 238 case TEST_OP2_STARTED:
238 GNUNET_assert (&op2 == cls); 239 GNUNET_assert (&op2 == cls);
239 result = TEST_OP2_RELEASED; 240 result = TEST_OP2_RELEASED;
240 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); 241 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task);
241 step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL); 242 //step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL);
242 break; 243 break;
243 case TEST_OP3_STARTED: 244 case TEST_OP3_STARTED:
244 GNUNET_assert (&op3 == cls); 245 GNUNET_assert (&op3 == cls);
diff --git a/src/testbed/testbed_api_operations.c b/src/testbed/testbed_api_operations.c
index 6252d04ab..137691e78 100644
--- a/src/testbed/testbed_api_operations.c
+++ b/src/testbed/testbed_api_operations.c
@@ -189,6 +189,26 @@ check_readiness (struct GNUNET_TESTBED_Operation *op)
189 189
190 190
191/** 191/**
192 * Defers a ready to be executed operation back to waiting
193 *
194 * @param op the operation to defer
195 */
196static void
197defer (struct GNUNET_TESTBED_Operation *op)
198{
199 unsigned int i;
200
201 GNUNET_assert (OP_STATE_READY == op->state);
202 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK != op->start_task_id);
203 GNUNET_SCHEDULER_cancel (op->start_task_id);
204 op->start_task_id = GNUNET_SCHEDULER_NO_TASK;
205 for (i = 0; i < op->nqueues; i++)
206 op->queues[i]->active--;
207 op->state = OP_STATE_WAITING;
208}
209
210
211/**
192 * Create an 'operation' to be performed. 212 * Create an 'operation' to be performed.
193 * 213 *
194 * @param cls closure for the callbacks 214 * @param cls closure for the callbacks
@@ -260,8 +280,18 @@ GNUNET_TESTBED_operation_queue_reset_max_active_ (struct OperationQueue *queue,
260 struct QueueEntry *entry; 280 struct QueueEntry *entry;
261 281
262 queue->max_active = max_active; 282 queue->max_active = max_active;
263 if (queue->active >= queue->max_active) 283 /* if (queue->active >= queue->max_active) */
264 return; 284 /* return; */
285
286 entry = queue->head;
287 while ( (queue->active > queue->max_active) &&
288 (NULL != entry))
289 {
290 if (entry->op->state == OP_STATE_READY)
291 defer (entry->op);
292 entry = entry->next;
293 }
294
265 entry = queue->head; 295 entry = queue->head;
266 while ( (NULL != entry) && 296 while ( (NULL != entry) &&
267 (queue->active < queue->max_active) ) 297 (queue->active < queue->max_active) )
@@ -336,10 +366,16 @@ GNUNET_TESTBED_operation_queue_remove_ (struct OperationQueue *queue,
336 if (entry->op == operation) 366 if (entry->op == operation)
337 break; 367 break;
338 GNUNET_assert (NULL != entry); 368 GNUNET_assert (NULL != entry);
339 if (OP_STATE_STARTED == operation->state) 369 switch (operation->state)
340 { 370 {
371 case OP_STATE_INIT:
372 case OP_STATE_WAITING:
373 break;
374 case OP_STATE_READY:
375 case OP_STATE_STARTED:
341 GNUNET_assert (0 != queue->active); 376 GNUNET_assert (0 != queue->active);
342 queue->active--; 377 queue->active--;
378 break;
343 } 379 }
344 entry2 = entry->next; 380 entry2 = entry->next;
345 GNUNET_CONTAINER_DLL_remove (queue->head, queue->tail, entry); 381 GNUNET_CONTAINER_DLL_remove (queue->head, queue->tail, entry);