diff options
author | Sree Harsha Totakura <totakura@in.tum.de> | 2013-01-01 22:43:24 +0000 |
---|---|---|
committer | Sree Harsha Totakura <totakura@in.tum.de> | 2013-01-01 22:43:24 +0000 |
commit | 5200c6d68ff70c484c480794e5debbc50b62e2aa (patch) | |
tree | be43708e648a31833b88d12015ba5e3383e09ba1 /src/testbed/testbed_api_operations.c | |
parent | ed8bae1885d78ce9d91bf742e0a8080a7e922b76 (diff) | |
download | gnunet-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.c | 42 |
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 | */ | ||
196 | static void | ||
197 | defer (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); |