aboutsummaryrefslogtreecommitdiff
path: root/src/testbed/testbed_api_operations.c
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/testbed/testbed_api_operations.c
parented8bae1885d78ce9d91bf742e0a8080a7e922b76 (diff)
downloadgnunet-5200c6d68ff70c484c480794e5debbc50b62e2aa.tar.gz
gnunet-5200c6d68ff70c484c480794e5debbc50b62e2aa.zip
- make operations wait when max_active is decreased
Diffstat (limited to 'src/testbed/testbed_api_operations.c')
-rw-r--r--src/testbed/testbed_api_operations.c42
1 files changed, 39 insertions, 3 deletions
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);