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 | |
parent | ed8bae1885d78ce9d91bf742e0a8080a7e922b76 (diff) | |
download | gnunet-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.c | 29 | ||||
-rw-r--r-- | src/testbed/testbed_api_operations.c | 42 |
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 | */ | ||
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); |