diff options
Diffstat (limited to 'src/testbed')
-rw-r--r-- | src/testbed/test_testbed_api_operations.c | 87 | ||||
-rw-r--r-- | src/testbed/testbed_api_operations.c | 15 |
2 files changed, 89 insertions, 13 deletions
diff --git a/src/testbed/test_testbed_api_operations.c b/src/testbed/test_testbed_api_operations.c index af3e68c20..3f556c88f 100644 --- a/src/testbed/test_testbed_api_operations.c +++ b/src/testbed/test_testbed_api_operations.c | |||
@@ -35,6 +35,12 @@ | |||
35 | GNUNET_log (kind, __VA_ARGS__) | 35 | GNUNET_log (kind, __VA_ARGS__) |
36 | 36 | ||
37 | /** | 37 | /** |
38 | * Delay to start step task | ||
39 | */ | ||
40 | #define STEP_DELAY \ | ||
41 | GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 500) | ||
42 | |||
43 | /** | ||
38 | * Queue A. Initially the max active is set to 2 and then reduced to 0 - this | 44 | * Queue A. Initially the max active is set to 2 and then reduced to 0 - this |
39 | * should block op2 even after op1 has finished. Later the max active is set to | 45 | * should block op2 even after op1 has finished. Later the max active is set to |
40 | * 2 and this should start op2 | 46 | * 2 and this should start op2 |
@@ -93,11 +99,20 @@ struct GNUNET_TESTBED_Operation *op7; | |||
93 | 99 | ||
94 | /** | 100 | /** |
95 | * This operation is started after op6 is finished in step task. It consumes 2 | 101 | * This operation is started after op6 is finished in step task. It consumes 2 |
96 | * resources on both queues q1 and q1. | 102 | * resources on both queues q1 and q2. This operation should evict op7. After |
103 | * starting, it should be made inactive, active and inactive again in the step task. | ||
97 | */ | 104 | */ |
98 | struct GNUNET_TESTBED_Operation *op8; | 105 | struct GNUNET_TESTBED_Operation *op8; |
99 | 106 | ||
100 | /** | 107 | /** |
108 | * This opration is started after activating op8. It should consume a resource | ||
109 | * on queues q1 and q2. It should not be started until op8 is again made | ||
110 | * inactive at which point it should be released. It can be released as soon as | ||
111 | * it begins. | ||
112 | */ | ||
113 | struct GNUNET_TESTBED_Operation *op9; | ||
114 | |||
115 | /** | ||
101 | * The delay task identifier | 116 | * The delay task identifier |
102 | */ | 117 | */ |
103 | GNUNET_SCHEDULER_TaskIdentifier step_task; | 118 | GNUNET_SCHEDULER_TaskIdentifier step_task; |
@@ -190,9 +205,29 @@ enum Test | |||
190 | TEST_OP8_STARTED, | 205 | TEST_OP8_STARTED, |
191 | 206 | ||
192 | /** | 207 | /** |
208 | * op8 is inactive | ||
209 | */ | ||
210 | TEST_OP8_INACTIVE_1, | ||
211 | |||
212 | /** | ||
213 | * op8 is active | ||
214 | */ | ||
215 | TEST_OP8_ACTIVE, | ||
216 | |||
217 | /** | ||
193 | * op8 has been released | 218 | * op8 has been released |
194 | */ | 219 | */ |
195 | TEST_OP8_RELEASED | 220 | TEST_OP8_RELEASED, |
221 | |||
222 | /** | ||
223 | * op9 has started | ||
224 | */ | ||
225 | TEST_OP9_STARTED, | ||
226 | |||
227 | /** | ||
228 | * op9 has been released | ||
229 | */ | ||
230 | TEST_OP9_RELEASED | ||
196 | }; | 231 | }; |
197 | 232 | ||
198 | /** | 233 | /** |
@@ -269,7 +304,26 @@ step (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
269 | GNUNET_TESTBED_operation_begin_wait_ (op8); | 304 | GNUNET_TESTBED_operation_begin_wait_ (op8); |
270 | break; | 305 | break; |
271 | case TEST_OP8_STARTED: | 306 | case TEST_OP8_STARTED: |
272 | GNUNET_TESTBED_operation_release_ (op8); | 307 | GNUNET_TESTBED_operation_inactivate_ (op8); |
308 | result = TEST_OP8_INACTIVE_1; | ||
309 | step_task = GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL); | ||
310 | break; | ||
311 | case TEST_OP8_INACTIVE_1: | ||
312 | GNUNET_TESTBED_operation_activate_ (op8); | ||
313 | result = TEST_OP8_ACTIVE; | ||
314 | op9 = GNUNET_TESTBED_operation_create_ (&op9, &start_cb, &release_cb); | ||
315 | GNUNET_TESTBED_operation_queue_insert2_ (q1, op9, 1); | ||
316 | GNUNET_TESTBED_operation_queue_insert2_ (q2, op9, 1); | ||
317 | GNUNET_TESTBED_operation_begin_wait_ (op9); | ||
318 | step_task = GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL); | ||
319 | break; | ||
320 | case TEST_OP8_ACTIVE: | ||
321 | GNUNET_TESTBED_operation_inactivate_ (op8); | ||
322 | /* op8 should be released by now due to above call */ | ||
323 | GNUNET_assert (TEST_OP8_RELEASED == result); | ||
324 | break; | ||
325 | case TEST_OP9_STARTED: | ||
326 | GNUNET_TESTBED_operation_release_ (op9); | ||
273 | break; | 327 | break; |
274 | default: | 328 | default: |
275 | GNUNET_assert (0); | 329 | GNUNET_assert (0); |
@@ -292,28 +346,28 @@ start_cb (void *cls) | |||
292 | result = TEST_OP1_STARTED; | 346 | result = TEST_OP1_STARTED; |
293 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); | 347 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); |
294 | step_task = | 348 | step_task = |
295 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL); | 349 | GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL); |
296 | break; | 350 | break; |
297 | case TEST_PAUSE: | 351 | case TEST_PAUSE: |
298 | GNUNET_assert (&op2 == cls); | 352 | GNUNET_assert (&op2 == cls); |
299 | result = TEST_OP2_STARTED; | 353 | result = TEST_OP2_STARTED; |
300 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); | 354 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); |
301 | step_task = | 355 | step_task = |
302 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL); | 356 | GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL); |
303 | break; | 357 | break; |
304 | case TEST_OP2_RELEASED: | 358 | case TEST_OP2_RELEASED: |
305 | GNUNET_assert (&op3 == cls); | 359 | GNUNET_assert (&op3 == cls); |
306 | result = TEST_OP3_STARTED; | 360 | result = TEST_OP3_STARTED; |
307 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); | 361 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); |
308 | step_task = | 362 | step_task = |
309 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL); | 363 | GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL); |
310 | break; | 364 | break; |
311 | case TEST_OP3_RELEASED: | 365 | case TEST_OP3_RELEASED: |
312 | GNUNET_assert (&op4 == cls); | 366 | GNUNET_assert (&op4 == cls); |
313 | result = TEST_OP4_STARTED; | 367 | result = TEST_OP4_STARTED; |
314 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); | 368 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); |
315 | step_task = | 369 | step_task = |
316 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL); | 370 | GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL); |
317 | break; | 371 | break; |
318 | case TEST_OP4_RELEASED: | 372 | case TEST_OP4_RELEASED: |
319 | { | 373 | { |
@@ -331,7 +385,12 @@ start_cb (void *cls) | |||
331 | case TEST_OP7_RELEASED: | 385 | case TEST_OP7_RELEASED: |
332 | GNUNET_assert (&op8 == cls); | 386 | GNUNET_assert (&op8 == cls); |
333 | result = TEST_OP8_STARTED; | 387 | result = TEST_OP8_STARTED; |
334 | step_task = GNUNET_SCHEDULER_add_now (&step, NULL); | 388 | step_task = GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL); |
389 | break; | ||
390 | case TEST_OP8_RELEASED: | ||
391 | GNUNET_assert (&op9 == cls); | ||
392 | result = TEST_OP9_STARTED; | ||
393 | step_task = GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL); | ||
335 | break; | 394 | break; |
336 | default: | 395 | default: |
337 | GNUNET_assert (0); | 396 | GNUNET_assert (0); |
@@ -358,13 +417,12 @@ release_cb (void *cls) | |||
358 | result = TEST_OP1_RELEASED; | 417 | result = TEST_OP1_RELEASED; |
359 | op1 = NULL; | 418 | op1 = NULL; |
360 | step_task = | 419 | step_task = |
361 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL); | 420 | GNUNET_SCHEDULER_add_delayed (STEP_DELAY, &step, NULL); |
362 | break; | 421 | break; |
363 | case TEST_OP2_STARTED: | 422 | case TEST_OP2_STARTED: |
364 | GNUNET_assert (&op2 == cls); | 423 | GNUNET_assert (&op2 == cls); |
365 | result = TEST_OP2_RELEASED; | 424 | result = TEST_OP2_RELEASED; |
366 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); | 425 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == step_task); |
367 | //step_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &step, NULL); | ||
368 | break; | 426 | break; |
369 | case TEST_OP3_STARTED: | 427 | case TEST_OP3_STARTED: |
370 | GNUNET_assert (&op3 == cls); | 428 | GNUNET_assert (&op3 == cls); |
@@ -402,9 +460,13 @@ release_cb (void *cls) | |||
402 | op7 = NULL; | 460 | op7 = NULL; |
403 | result = TEST_OP7_RELEASED; | 461 | result = TEST_OP7_RELEASED; |
404 | break; | 462 | break; |
405 | case TEST_OP8_STARTED: | 463 | case TEST_OP8_ACTIVE: |
406 | result = TEST_OP8_RELEASED; | 464 | result = TEST_OP8_RELEASED; |
407 | op8 = NULL; | 465 | op8 = NULL; |
466 | break; | ||
467 | case TEST_OP9_STARTED: | ||
468 | GNUNET_assert (&op9 == cls); | ||
469 | result = TEST_OP9_RELEASED; | ||
408 | GNUNET_TESTBED_operation_queue_destroy_ (q1); | 470 | GNUNET_TESTBED_operation_queue_destroy_ (q1); |
409 | GNUNET_TESTBED_operation_queue_destroy_ (q2); | 471 | GNUNET_TESTBED_operation_queue_destroy_ (q2); |
410 | q1 = NULL; | 472 | q1 = NULL; |
@@ -461,7 +523,7 @@ main (int argc, char **argv) | |||
461 | GNUNET_PROGRAM_run ((sizeof (argv2) / sizeof (char *)) - 1, argv2, | 523 | GNUNET_PROGRAM_run ((sizeof (argv2) / sizeof (char *)) - 1, argv2, |
462 | "test_testbed_api_operations", "nohelp", options, | 524 | "test_testbed_api_operations", "nohelp", options, |
463 | &run, NULL); | 525 | &run, NULL); |
464 | if ((GNUNET_OK != ret) || (TEST_OP8_RELEASED != result)) | 526 | if ((GNUNET_OK != ret) || (TEST_OP9_RELEASED != result)) |
465 | return 1; | 527 | return 1; |
466 | op1 = NULL; | 528 | op1 = NULL; |
467 | op2 = NULL; | 529 | op2 = NULL; |
@@ -471,6 +533,7 @@ main (int argc, char **argv) | |||
471 | op6 = NULL; | 533 | op6 = NULL; |
472 | op7 = NULL; | 534 | op7 = NULL; |
473 | op8 = NULL; | 535 | op8 = NULL; |
536 | op9 = NULL; | ||
474 | q1 = NULL; | 537 | q1 = NULL; |
475 | q2 = NULL; | 538 | q2 = NULL; |
476 | return 0; | 539 | return 0; |
diff --git a/src/testbed/testbed_api_operations.c b/src/testbed/testbed_api_operations.c index fc5da29b5..72d1733c9 100644 --- a/src/testbed/testbed_api_operations.c +++ b/src/testbed/testbed_api_operations.c | |||
@@ -635,7 +635,7 @@ recheck_waiting (struct OperationQueue *opq) | |||
635 | struct QueueEntry *entry2; | 635 | struct QueueEntry *entry2; |
636 | 636 | ||
637 | entry = opq->wq_head; | 637 | entry = opq->wq_head; |
638 | while ( (NULL != entry) && (opq->active < opq->max_active) ) | 638 | while (NULL != entry) |
639 | { | 639 | { |
640 | entry2 = entry->next; | 640 | entry2 = entry->next; |
641 | check_readiness (entry->op); | 641 | check_readiness (entry->op); |
@@ -741,8 +741,20 @@ GNUNET_TESTBED_operation_begin_wait_ (struct GNUNET_TESTBED_Operation *op) | |||
741 | void | 741 | void |
742 | GNUNET_TESTBED_operation_inactivate_ (struct GNUNET_TESTBED_Operation *op) | 742 | GNUNET_TESTBED_operation_inactivate_ (struct GNUNET_TESTBED_Operation *op) |
743 | { | 743 | { |
744 | struct OperationQueue **queues; | ||
745 | size_t ms; | ||
746 | unsigned int nqueues; | ||
747 | unsigned int i; | ||
748 | |||
744 | GNUNET_assert (OP_STATE_STARTED == op->state); | 749 | GNUNET_assert (OP_STATE_STARTED == op->state); |
745 | change_state (op, OP_STATE_INACTIVE); | 750 | change_state (op, OP_STATE_INACTIVE); |
751 | nqueues = op->nqueues; | ||
752 | ms = sizeof (struct OperationQueue *) * nqueues; | ||
753 | queues = GNUNET_malloc (ms); | ||
754 | GNUNET_assert (NULL != (queues = memcpy (queues, op->queues, ms))); | ||
755 | for (i = 0; i < nqueues; i++) | ||
756 | recheck_waiting (queues[i]); | ||
757 | GNUNET_free (queues); | ||
746 | } | 758 | } |
747 | 759 | ||
748 | 760 | ||
@@ -756,6 +768,7 @@ GNUNET_TESTBED_operation_inactivate_ (struct GNUNET_TESTBED_Operation *op) | |||
756 | void | 768 | void |
757 | GNUNET_TESTBED_operation_activate_ (struct GNUNET_TESTBED_Operation *op) | 769 | GNUNET_TESTBED_operation_activate_ (struct GNUNET_TESTBED_Operation *op) |
758 | { | 770 | { |
771 | |||
759 | GNUNET_assert (OP_STATE_INACTIVE == op->state); | 772 | GNUNET_assert (OP_STATE_INACTIVE == op->state); |
760 | change_state (op, OP_STATE_STARTED); | 773 | change_state (op, OP_STATE_STARTED); |
761 | } | 774 | } |