diff options
author | Christian Grothoff <christian@grothoff.org> | 2016-04-30 08:17:37 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2016-04-30 08:17:37 +0000 |
commit | 95f9076a2139f5fb042b944a0658b6cda2fa35db (patch) | |
tree | b0826a2a1dcf812e6b4450fe6b05d47cd53ae49d /src/arm/gnunet-arm.c | |
parent | 7746f68db77b9ca3c4aaca24ab2ce5253461240b (diff) | |
download | gnunet-95f9076a2139f5fb042b944a0658b6cda2fa35db.tar.gz gnunet-95f9076a2139f5fb042b944a0658b6cda2fa35db.zip |
implementing new scheduler shutdown semantics
Diffstat (limited to 'src/arm/gnunet-arm.c')
-rw-r--r-- | src/arm/gnunet-arm.c | 79 |
1 files changed, 50 insertions, 29 deletions
diff --git a/src/arm/gnunet-arm.c b/src/arm/gnunet-arm.c index af85372d8..4501ed036 100644 --- a/src/arm/gnunet-arm.c +++ b/src/arm/gnunet-arm.c | |||
@@ -145,6 +145,11 @@ static unsigned int no_stdout; | |||
145 | */ | 145 | */ |
146 | static unsigned int no_stderr; | 146 | static unsigned int no_stderr; |
147 | 147 | ||
148 | /** | ||
149 | * Handle for the task running the #action_loop(). | ||
150 | */ | ||
151 | static struct GNUNET_SCHEDULER_Task *al_task; | ||
152 | |||
148 | 153 | ||
149 | /** | 154 | /** |
150 | * Attempts to delete configuration file and GNUNET_HOME | 155 | * Attempts to delete configuration file and GNUNET_HOME |
@@ -183,6 +188,11 @@ delete_files () | |||
183 | static void | 188 | static void |
184 | shutdown_task (void *cls) | 189 | shutdown_task (void *cls) |
185 | { | 190 | { |
191 | if (NULL != al_task) | ||
192 | { | ||
193 | GNUNET_SCHEDULER_cancel (al_task); | ||
194 | al_task = NULL; | ||
195 | } | ||
186 | if (NULL != h) | 196 | if (NULL != h) |
187 | { | 197 | { |
188 | GNUNET_ARM_disconnect_and_free (h); | 198 | GNUNET_ARM_disconnect_and_free (h); |
@@ -314,7 +324,8 @@ conn_status (void *cls, | |||
314 | */ | 324 | */ |
315 | static void | 325 | static void |
316 | start_callback (void *cls, | 326 | start_callback (void *cls, |
317 | enum GNUNET_ARM_RequestStatus rs, const char *service, | 327 | enum GNUNET_ARM_RequestStatus rs, |
328 | const char *service, | ||
318 | enum GNUNET_ARM_Result result) | 329 | enum GNUNET_ARM_Result result) |
319 | { | 330 | { |
320 | char *msg; | 331 | char *msg; |
@@ -336,9 +347,10 @@ start_callback (void *cls, | |||
336 | GNUNET_SCHEDULER_shutdown (); | 347 | GNUNET_SCHEDULER_shutdown (); |
337 | return; | 348 | return; |
338 | } | 349 | } |
339 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ARM service [re]start successful\n"); | 350 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
351 | "ARM service [re]start successful\n"); | ||
340 | start = 0; | 352 | start = 0; |
341 | GNUNET_SCHEDULER_add_now (action_loop, NULL); | 353 | al_task = GNUNET_SCHEDULER_add_now (&action_loop, NULL); |
342 | } | 354 | } |
343 | 355 | ||
344 | 356 | ||
@@ -356,7 +368,8 @@ start_callback (void *cls, | |||
356 | */ | 368 | */ |
357 | static void | 369 | static void |
358 | stop_callback (void *cls, | 370 | stop_callback (void *cls, |
359 | enum GNUNET_ARM_RequestStatus rs, const char *service, | 371 | enum GNUNET_ARM_RequestStatus rs, |
372 | const char *service, | ||
360 | enum GNUNET_ARM_Result result) | 373 | enum GNUNET_ARM_Result result) |
361 | { | 374 | { |
362 | char *msg; | 375 | char *msg; |
@@ -374,7 +387,8 @@ stop_callback (void *cls, | |||
374 | (GNUNET_ARM_RESULT_STOPPED != result) && | 387 | (GNUNET_ARM_RESULT_STOPPED != result) && |
375 | (GNUNET_ARM_RESULT_IS_STOPPED_ALREADY != result)) | 388 | (GNUNET_ARM_RESULT_IS_STOPPED_ALREADY != result)) |
376 | { | 389 | { |
377 | GNUNET_asprintf (&msg, "%s", _("Failed to stop the ARM service: %s\n")); | 390 | GNUNET_asprintf (&msg, "%s", |
391 | _("Failed to stop the ARM service: %s\n")); | ||
378 | FPRINTF (stdout, msg, ret_string (result)); | 392 | FPRINTF (stdout, msg, ret_string (result)); |
379 | GNUNET_free (msg); | 393 | GNUNET_free (msg); |
380 | GNUNET_SCHEDULER_shutdown (); | 394 | GNUNET_SCHEDULER_shutdown (); |
@@ -390,7 +404,7 @@ stop_callback (void *cls, | |||
390 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 404 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
391 | "Initiating an ARM restart\n"); | 405 | "Initiating an ARM restart\n"); |
392 | } | 406 | } |
393 | GNUNET_SCHEDULER_add_now (&action_loop, NULL); | 407 | al_task = GNUNET_SCHEDULER_add_now (&action_loop, NULL); |
394 | } | 408 | } |
395 | 409 | ||
396 | 410 | ||
@@ -408,7 +422,8 @@ stop_callback (void *cls, | |||
408 | */ | 422 | */ |
409 | static void | 423 | static void |
410 | init_callback (void *cls, | 424 | init_callback (void *cls, |
411 | enum GNUNET_ARM_RequestStatus rs, const char *service, | 425 | enum GNUNET_ARM_RequestStatus rs, |
426 | const char *service, | ||
412 | enum GNUNET_ARM_Result result) | 427 | enum GNUNET_ARM_Result result) |
413 | { | 428 | { |
414 | char *msg; | 429 | char *msg; |
@@ -438,7 +453,7 @@ init_callback (void *cls, | |||
438 | init); | 453 | init); |
439 | GNUNET_free (init); | 454 | GNUNET_free (init); |
440 | init = NULL; | 455 | init = NULL; |
441 | GNUNET_SCHEDULER_add_now (&action_loop, NULL); | 456 | al_task = GNUNET_SCHEDULER_add_now (&action_loop, NULL); |
442 | } | 457 | } |
443 | 458 | ||
444 | 459 | ||
@@ -456,7 +471,8 @@ init_callback (void *cls, | |||
456 | */ | 471 | */ |
457 | static void | 472 | static void |
458 | term_callback (void *cls, | 473 | term_callback (void *cls, |
459 | enum GNUNET_ARM_RequestStatus rs, const char *service, | 474 | enum GNUNET_ARM_RequestStatus rs, |
475 | const char *service, | ||
460 | enum GNUNET_ARM_Result result) | 476 | enum GNUNET_ARM_Result result) |
461 | { | 477 | { |
462 | char *msg; | 478 | char *msg; |
@@ -487,7 +503,7 @@ term_callback (void *cls, | |||
487 | term); | 503 | term); |
488 | GNUNET_free (term); | 504 | GNUNET_free (term); |
489 | term = NULL; | 505 | term = NULL; |
490 | GNUNET_SCHEDULER_add_now (&action_loop, NULL); | 506 | al_task = GNUNET_SCHEDULER_add_now (&action_loop, NULL); |
491 | } | 507 | } |
492 | 508 | ||
493 | 509 | ||
@@ -503,7 +519,8 @@ term_callback (void *cls, | |||
503 | */ | 519 | */ |
504 | static void | 520 | static void |
505 | list_callback (void *cls, | 521 | list_callback (void *cls, |
506 | enum GNUNET_ARM_RequestStatus rs, unsigned int count, | 522 | enum GNUNET_ARM_RequestStatus rs, |
523 | unsigned int count, | ||
507 | const char *const*list) | 524 | const char *const*list) |
508 | { | 525 | { |
509 | unsigned int i; | 526 | unsigned int i; |
@@ -512,7 +529,8 @@ list_callback (void *cls, | |||
512 | { | 529 | { |
513 | char *msg; | 530 | char *msg; |
514 | 531 | ||
515 | GNUNET_asprintf (&msg, "%s", _("Failed to request a list of services: %s\n")); | 532 | GNUNET_asprintf (&msg, "%s", |
533 | _("Failed to request a list of services: %s\n")); | ||
516 | FPRINTF (stdout, msg, req_string (rs)); | 534 | FPRINTF (stdout, msg, req_string (rs)); |
517 | GNUNET_free (msg); | 535 | GNUNET_free (msg); |
518 | ret = 3; | 536 | ret = 3; |
@@ -520,7 +538,8 @@ list_callback (void *cls, | |||
520 | } | 538 | } |
521 | if (NULL == list) | 539 | if (NULL == list) |
522 | { | 540 | { |
523 | FPRINTF (stderr, "%s", _("Error communicating with ARM. ARM not running?\n")); | 541 | FPRINTF (stderr, "%s", |
542 | _("Error communicating with ARM. ARM not running?\n")); | ||
524 | GNUNET_SCHEDULER_shutdown (); | 543 | GNUNET_SCHEDULER_shutdown (); |
525 | ret = 3; | 544 | ret = 3; |
526 | return; | 545 | return; |
@@ -528,7 +547,7 @@ list_callback (void *cls, | |||
528 | FPRINTF (stdout, "%s", _("Running services:\n")); | 547 | FPRINTF (stdout, "%s", _("Running services:\n")); |
529 | for (i = 0; i < count; i++) | 548 | for (i = 0; i < count; i++) |
530 | FPRINTF (stdout, "%s\n", list[i]); | 549 | FPRINTF (stdout, "%s\n", list[i]); |
531 | GNUNET_SCHEDULER_add_now (&action_loop, NULL); | 550 | al_task = GNUNET_SCHEDULER_add_now (&action_loop, NULL); |
532 | } | 551 | } |
533 | 552 | ||
534 | 553 | ||
@@ -541,12 +560,9 @@ list_callback (void *cls, | |||
541 | static void | 560 | static void |
542 | action_loop (void *cls) | 561 | action_loop (void *cls) |
543 | { | 562 | { |
544 | const struct GNUNET_SCHEDULER_TaskContext *tc; | 563 | al_task = NULL; |
545 | 564 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | |
546 | tc = GNUNET_SCHEDULER_get_task_context (); | 565 | "Running requested actions\n"); |
547 | if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) | ||
548 | return; | ||
549 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Running requested actions\n"); | ||
550 | while (1) | 566 | while (1) |
551 | { | 567 | { |
552 | switch (phase++) | 568 | switch (phase++) |
@@ -554,7 +570,8 @@ action_loop (void *cls) | |||
554 | case 0: | 570 | case 0: |
555 | if (NULL != term) | 571 | if (NULL != term) |
556 | { | 572 | { |
557 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Termination action\n"); | 573 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
574 | "Termination action\n"); | ||
558 | GNUNET_ARM_request_service_stop (h, term, | 575 | GNUNET_ARM_request_service_stop (h, term, |
559 | (0 == timeout.rel_value_us) ? STOP_TIMEOUT : timeout, | 576 | (0 == timeout.rel_value_us) ? STOP_TIMEOUT : timeout, |
560 | &term_callback, NULL); | 577 | &term_callback, NULL); |
@@ -564,7 +581,8 @@ action_loop (void *cls) | |||
564 | case 1: | 581 | case 1: |
565 | if (end || restart) | 582 | if (end || restart) |
566 | { | 583 | { |
567 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "End action\n"); | 584 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
585 | "End action\n"); | ||
568 | GNUNET_ARM_request_service_stop (h, "arm", | 586 | GNUNET_ARM_request_service_stop (h, "arm", |
569 | (0 == timeout.rel_value_us) ? STOP_TIMEOUT_ARM : timeout, | 587 | (0 == timeout.rel_value_us) ? STOP_TIMEOUT_ARM : timeout, |
570 | &stop_callback, NULL); | 588 | &stop_callback, NULL); |
@@ -574,7 +592,8 @@ action_loop (void *cls) | |||
574 | case 2: | 592 | case 2: |
575 | if (start) | 593 | if (start) |
576 | { | 594 | { |
577 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Start action\n"); | 595 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
596 | "Start action\n"); | ||
578 | GNUNET_ARM_request_service_start (h, "arm", | 597 | GNUNET_ARM_request_service_start (h, "arm", |
579 | (no_stdout ? 0 : GNUNET_OS_INHERIT_STD_OUT) | | 598 | (no_stdout ? 0 : GNUNET_OS_INHERIT_STD_OUT) | |
580 | (no_stderr ? 0 : GNUNET_OS_INHERIT_STD_ERR), | 599 | (no_stderr ? 0 : GNUNET_OS_INHERIT_STD_ERR), |
@@ -586,8 +605,10 @@ action_loop (void *cls) | |||
586 | case 3: | 605 | case 3: |
587 | if (NULL != init) | 606 | if (NULL != init) |
588 | { | 607 | { |
589 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Initialization action\n"); | 608 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
590 | GNUNET_ARM_request_service_start (h, init, GNUNET_OS_INHERIT_STD_NONE, | 609 | "Initialization action\n"); |
610 | GNUNET_ARM_request_service_start (h, init, | ||
611 | GNUNET_OS_INHERIT_STD_NONE, | ||
591 | (0 == timeout.rel_value_us) ? STOP_TIMEOUT : timeout, | 612 | (0 == timeout.rel_value_us) ? STOP_TIMEOUT : timeout, |
592 | &init_callback, NULL); | 613 | &init_callback, NULL); |
593 | return; | 614 | return; |
@@ -631,7 +652,8 @@ action_loop (void *cls) | |||
631 | */ | 652 | */ |
632 | static void | 653 | static void |
633 | srv_status (void *cls, | 654 | srv_status (void *cls, |
634 | const char *service, enum GNUNET_ARM_ServiceStatus status) | 655 | const char *service, |
656 | enum GNUNET_ARM_ServiceStatus status) | ||
635 | { | 657 | { |
636 | const char *msg; | 658 | const char *msg; |
637 | 659 | ||
@@ -704,9 +726,8 @@ run (void *cls, | |||
704 | return; | 726 | return; |
705 | if (monitor) | 727 | if (monitor) |
706 | m = GNUNET_ARM_monitor (cfg, &srv_status, NULL); | 728 | m = GNUNET_ARM_monitor (cfg, &srv_status, NULL); |
707 | GNUNET_SCHEDULER_add_now (&action_loop, NULL); | 729 | al_task = GNUNET_SCHEDULER_add_now (&action_loop, NULL); |
708 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, | 730 | GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); |
709 | &shutdown_task, NULL); | ||
710 | } | 731 | } |
711 | 732 | ||
712 | 733 | ||