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 | |
parent | 7746f68db77b9ca3c4aaca24ab2ce5253461240b (diff) | |
download | gnunet-95f9076a2139f5fb042b944a0658b6cda2fa35db.tar.gz gnunet-95f9076a2139f5fb042b944a0658b6cda2fa35db.zip |
implementing new scheduler shutdown semantics
Diffstat (limited to 'src/arm')
-rw-r--r-- | src/arm/arm_api.c | 13 | ||||
-rw-r--r-- | src/arm/gnunet-arm.c | 79 | ||||
-rw-r--r-- | src/arm/gnunet-service-arm.c | 89 | ||||
-rw-r--r-- | src/arm/test_arm_api.c | 2 | ||||
-rw-r--r-- | src/arm/test_exponential_backoff.c | 16 |
5 files changed, 114 insertions, 85 deletions
diff --git a/src/arm/arm_api.c b/src/arm/arm_api.c index c708f9150..5fb2a811a 100644 --- a/src/arm/arm_api.c +++ b/src/arm/arm_api.c | |||
@@ -241,7 +241,9 @@ reconnect_arm_later (struct GNUNET_ARM_Handle *h) | |||
241 | h->currently_down = GNUNET_YES; | 241 | h->currently_down = GNUNET_YES; |
242 | GNUNET_assert (NULL == h->reconnect_task); | 242 | GNUNET_assert (NULL == h->reconnect_task); |
243 | h->reconnect_task = | 243 | h->reconnect_task = |
244 | GNUNET_SCHEDULER_add_delayed (h->retry_backoff, &reconnect_arm_task, h); | 244 | GNUNET_SCHEDULER_add_delayed (h->retry_backoff, |
245 | &reconnect_arm_task, | ||
246 | h); | ||
245 | /* Don't clear pending messages on disconnection, deliver them later | 247 | /* Don't clear pending messages on disconnection, deliver them later |
246 | clear_pending_messages (h, GNUNET_ARM_REQUEST_DISCONNECTED); | 248 | clear_pending_messages (h, GNUNET_ARM_REQUEST_DISCONNECTED); |
247 | GNUNET_assert (NULL == h->control_pending_head); | 249 | GNUNET_assert (NULL == h->control_pending_head); |
@@ -635,7 +637,8 @@ reconnect_arm (struct GNUNET_ARM_Handle *h) | |||
635 | */ | 637 | */ |
636 | struct GNUNET_ARM_Handle * | 638 | struct GNUNET_ARM_Handle * |
637 | GNUNET_ARM_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, | 639 | GNUNET_ARM_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, |
638 | GNUNET_ARM_ConnectionStatusCallback conn_status, void *cls) | 640 | GNUNET_ARM_ConnectionStatusCallback conn_status, |
641 | void *cls) | ||
639 | { | 642 | { |
640 | struct GNUNET_ARM_Handle *h; | 643 | struct GNUNET_ARM_Handle *h; |
641 | 644 | ||
@@ -942,7 +945,8 @@ change_service (struct GNUNET_ARM_Handle *h, const char *service_name, | |||
942 | h->control_pending_tail, cm); | 945 | h->control_pending_tail, cm); |
943 | cm->timeout_task_id = | 946 | cm->timeout_task_id = |
944 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining | 947 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining |
945 | (cm->timeout), &control_message_timeout, cm); | 948 | (cm->timeout), |
949 | &control_message_timeout, cm); | ||
946 | trigger_next_request (h, GNUNET_NO); | 950 | trigger_next_request (h, GNUNET_NO); |
947 | } | 951 | } |
948 | 952 | ||
@@ -1106,7 +1110,8 @@ GNUNET_ARM_request_service_list (struct GNUNET_ARM_Handle *h, | |||
1106 | h->control_pending_tail, cm); | 1110 | h->control_pending_tail, cm); |
1107 | cm->timeout_task_id = | 1111 | cm->timeout_task_id = |
1108 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining | 1112 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining |
1109 | (cm->timeout), &control_message_timeout, cm); | 1113 | (cm->timeout), |
1114 | &control_message_timeout, cm); | ||
1110 | trigger_next_request (h, GNUNET_NO); | 1115 | trigger_next_request (h, GNUNET_NO); |
1111 | } | 1116 | } |
1112 | 1117 | ||
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 | ||
diff --git a/src/arm/gnunet-service-arm.c b/src/arm/gnunet-service-arm.c index 9feb6e9c1..152a358fc 100644 --- a/src/arm/gnunet-service-arm.c +++ b/src/arm/gnunet-service-arm.c | |||
@@ -610,13 +610,9 @@ accept_connection (void *cls) | |||
610 | { | 610 | { |
611 | struct ServiceListeningInfo *sli = cls; | 611 | struct ServiceListeningInfo *sli = cls; |
612 | struct ServiceList *sl = sli->sl; | 612 | struct ServiceList *sl = sli->sl; |
613 | const struct GNUNET_SCHEDULER_TaskContext *tc; | ||
614 | 613 | ||
615 | sli->accept_task = NULL; | 614 | sli->accept_task = NULL; |
616 | GNUNET_assert (GNUNET_NO == in_shutdown); | 615 | GNUNET_assert (GNUNET_NO == in_shutdown); |
617 | tc = GNUNET_SCHEDULER_get_task_context (); | ||
618 | if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason)) | ||
619 | return; | ||
620 | start_process (sl, NULL, 0); | 616 | start_process (sl, NULL, 0); |
621 | } | 617 | } |
622 | 618 | ||
@@ -734,7 +730,9 @@ create_listen_socket (struct sockaddr *sa, | |||
734 | sli->accept_task = | 730 | sli->accept_task = |
735 | GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, sock, | 731 | GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, sock, |
736 | &accept_connection, sli); | 732 | &accept_connection, sli); |
737 | GNUNET_CONTAINER_DLL_insert (sl->listen_head, sl->listen_tail, sli); | 733 | GNUNET_CONTAINER_DLL_insert (sl->listen_head, |
734 | sl->listen_tail, | ||
735 | sli); | ||
738 | } | 736 | } |
739 | 737 | ||
740 | 738 | ||
@@ -866,17 +864,24 @@ handle_stop (void *cls, | |||
866 | servicename); | 864 | servicename); |
867 | if (0 == strcasecmp (servicename, "arm")) | 865 | if (0 == strcasecmp (servicename, "arm")) |
868 | { | 866 | { |
869 | broadcast_status (servicename, GNUNET_ARM_SERVICE_STOPPING, NULL); | 867 | broadcast_status (servicename, |
870 | signal_result (client, servicename, request_id, GNUNET_ARM_RESULT_STOPPING); | 868 | GNUNET_ARM_SERVICE_STOPPING, NULL); |
869 | signal_result (client, | ||
870 | servicename, | ||
871 | request_id, | ||
872 | GNUNET_ARM_RESULT_STOPPING); | ||
871 | GNUNET_SERVER_client_persist_ (client); | 873 | GNUNET_SERVER_client_persist_ (client); |
872 | GNUNET_SCHEDULER_add_now (trigger_shutdown, NULL); | 874 | GNUNET_SCHEDULER_add_now (&trigger_shutdown, NULL); |
873 | GNUNET_SERVER_receive_done (client, GNUNET_OK); | 875 | GNUNET_SERVER_receive_done (client, GNUNET_OK); |
874 | return; | 876 | return; |
875 | } | 877 | } |
876 | sl = find_service (servicename); | 878 | sl = find_service (servicename); |
877 | if (sl == NULL) | 879 | if (sl == NULL) |
878 | { | 880 | { |
879 | signal_result (client, servicename, request_id, GNUNET_ARM_RESULT_IS_NOT_KNOWN); | 881 | signal_result (client, |
882 | servicename, | ||
883 | request_id, | ||
884 | GNUNET_ARM_RESULT_IS_NOT_KNOWN); | ||
880 | GNUNET_SERVER_receive_done (client, GNUNET_OK); | 885 | GNUNET_SERVER_receive_done (client, GNUNET_OK); |
881 | return; | 886 | return; |
882 | } | 887 | } |
@@ -884,14 +889,19 @@ handle_stop (void *cls, | |||
884 | if (GNUNET_YES == in_shutdown) | 889 | if (GNUNET_YES == in_shutdown) |
885 | { | 890 | { |
886 | /* shutdown in progress */ | 891 | /* shutdown in progress */ |
887 | signal_result (client, servicename, request_id, GNUNET_ARM_RESULT_IN_SHUTDOWN); | 892 | signal_result (client, |
893 | servicename, | ||
894 | request_id, | ||
895 | GNUNET_ARM_RESULT_IN_SHUTDOWN); | ||
888 | GNUNET_SERVER_receive_done (client, GNUNET_OK); | 896 | GNUNET_SERVER_receive_done (client, GNUNET_OK); |
889 | return; | 897 | return; |
890 | } | 898 | } |
891 | if (NULL != sl->killing_client) | 899 | if (NULL != sl->killing_client) |
892 | { | 900 | { |
893 | /* killing already in progress */ | 901 | /* killing already in progress */ |
894 | signal_result (client, servicename, request_id, | 902 | signal_result (client, |
903 | servicename, | ||
904 | request_id, | ||
895 | GNUNET_ARM_RESULT_IS_STOPPING_ALREADY); | 905 | GNUNET_ARM_RESULT_IS_STOPPING_ALREADY); |
896 | GNUNET_SERVER_receive_done (client, GNUNET_OK); | 906 | GNUNET_SERVER_receive_done (client, GNUNET_OK); |
897 | return; | 907 | return; |
@@ -899,7 +909,9 @@ handle_stop (void *cls, | |||
899 | if (NULL == sl->proc) | 909 | if (NULL == sl->proc) |
900 | { | 910 | { |
901 | /* process is down */ | 911 | /* process is down */ |
902 | signal_result (client, servicename, request_id, | 912 | signal_result (client, |
913 | servicename, | ||
914 | request_id, | ||
903 | GNUNET_ARM_RESULT_IS_STOPPED_ALREADY); | 915 | GNUNET_ARM_RESULT_IS_STOPPED_ALREADY); |
904 | GNUNET_SERVER_receive_done (client, GNUNET_OK); | 916 | GNUNET_SERVER_receive_done (client, GNUNET_OK); |
905 | return; | 917 | return; |
@@ -907,7 +919,9 @@ handle_stop (void *cls, | |||
907 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 919 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
908 | "Sending kill signal to service `%s', waiting for process to die.\n", | 920 | "Sending kill signal to service `%s', waiting for process to die.\n", |
909 | servicename); | 921 | servicename); |
910 | broadcast_status (servicename, GNUNET_ARM_SERVICE_STOPPING, NULL); | 922 | broadcast_status (servicename, |
923 | GNUNET_ARM_SERVICE_STOPPING, | ||
924 | NULL); | ||
911 | /* no signal_start - only when it's STOPPED */ | 925 | /* no signal_start - only when it's STOPPED */ |
912 | sl->killed_at = GNUNET_TIME_absolute_get (); | 926 | sl->killed_at = GNUNET_TIME_absolute_get (); |
913 | if (0 != GNUNET_OS_process_kill (sl->proc, GNUNET_TERM_SIG)) | 927 | if (0 != GNUNET_OS_process_kill (sl->proc, GNUNET_TERM_SIG)) |
@@ -1055,7 +1069,8 @@ shutdown_task (void *cls) | |||
1055 | while (NULL != (sli = pos->listen_head)) | 1069 | while (NULL != (sli = pos->listen_head)) |
1056 | { | 1070 | { |
1057 | GNUNET_CONTAINER_DLL_remove (pos->listen_head, | 1071 | GNUNET_CONTAINER_DLL_remove (pos->listen_head, |
1058 | pos->listen_tail, sli); | 1072 | pos->listen_tail, |
1073 | sli); | ||
1059 | if (NULL != sli->accept_task) | 1074 | if (NULL != sli->accept_task) |
1060 | { | 1075 | { |
1061 | GNUNET_SCHEDULER_cancel (sli->accept_task); | 1076 | GNUNET_SCHEDULER_cancel (sli->accept_task); |
@@ -1072,7 +1087,7 @@ shutdown_task (void *cls) | |||
1072 | while (NULL != (pos = nxt)) | 1087 | while (NULL != (pos = nxt)) |
1073 | { | 1088 | { |
1074 | nxt = pos->next; | 1089 | nxt = pos->next; |
1075 | if (pos->proc != NULL) | 1090 | if (NULL != pos->proc) |
1076 | { | 1091 | { |
1077 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 1092 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
1078 | "Stopping service `%s'\n", | 1093 | "Stopping service `%s'\n", |
@@ -1087,7 +1102,7 @@ shutdown_task (void *cls) | |||
1087 | } | 1102 | } |
1088 | } | 1103 | } |
1089 | /* finally, should all service processes be already gone, terminate for real */ | 1104 | /* finally, should all service processes be already gone, terminate for real */ |
1090 | if (running_head == NULL) | 1105 | if (NULL == running_head) |
1091 | do_shutdown (); | 1106 | do_shutdown (); |
1092 | else | 1107 | else |
1093 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1108 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
@@ -1105,15 +1120,11 @@ static void | |||
1105 | delayed_restart_task (void *cls) | 1120 | delayed_restart_task (void *cls) |
1106 | 1121 | ||
1107 | { | 1122 | { |
1108 | const struct GNUNET_SCHEDULER_TaskContext *tc; | ||
1109 | struct ServiceList *sl; | 1123 | struct ServiceList *sl; |
1110 | struct GNUNET_TIME_Relative lowestRestartDelay; | 1124 | struct GNUNET_TIME_Relative lowestRestartDelay; |
1111 | struct ServiceListeningInfo *sli; | 1125 | struct ServiceListeningInfo *sli; |
1112 | 1126 | ||
1113 | child_restart_task = NULL; | 1127 | child_restart_task = NULL; |
1114 | tc = GNUNET_SCHEDULER_get_task_context (); | ||
1115 | if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) | ||
1116 | return; | ||
1117 | GNUNET_assert (GNUNET_NO == in_shutdown); | 1128 | GNUNET_assert (GNUNET_NO == in_shutdown); |
1118 | lowestRestartDelay = GNUNET_TIME_UNIT_FOREVER_REL; | 1129 | lowestRestartDelay = GNUNET_TIME_UNIT_FOREVER_REL; |
1119 | 1130 | ||
@@ -1144,7 +1155,8 @@ delayed_restart_task (void *cls) | |||
1144 | /* accept was actually paused, so start it again */ | 1155 | /* accept was actually paused, so start it again */ |
1145 | sli->accept_task = | 1156 | sli->accept_task = |
1146 | GNUNET_SCHEDULER_add_read_net | 1157 | GNUNET_SCHEDULER_add_read_net |
1147 | (GNUNET_TIME_UNIT_FOREVER_REL, sli->listen_socket, | 1158 | (GNUNET_TIME_UNIT_FOREVER_REL, |
1159 | sli->listen_socket, | ||
1148 | &accept_connection, sli); | 1160 | &accept_connection, sli); |
1149 | } | 1161 | } |
1150 | } | 1162 | } |
@@ -1180,7 +1192,6 @@ delayed_restart_task (void *cls) | |||
1180 | static void | 1192 | static void |
1181 | maint_child_death (void *cls) | 1193 | maint_child_death (void *cls) |
1182 | { | 1194 | { |
1183 | const struct GNUNET_SCHEDULER_TaskContext *tc; | ||
1184 | struct ServiceList *pos; | 1195 | struct ServiceList *pos; |
1185 | struct ServiceList *next; | 1196 | struct ServiceList *next; |
1186 | struct ServiceListeningInfo *sli; | 1197 | struct ServiceListeningInfo *sli; |
@@ -1192,19 +1203,9 @@ maint_child_death (void *cls) | |||
1192 | unsigned long statusCode; | 1203 | unsigned long statusCode; |
1193 | const struct GNUNET_DISK_FileHandle *pr; | 1204 | const struct GNUNET_DISK_FileHandle *pr; |
1194 | 1205 | ||
1195 | pr = GNUNET_DISK_pipe_handle (sigpipe, GNUNET_DISK_PIPE_END_READ); | 1206 | pr = GNUNET_DISK_pipe_handle (sigpipe, |
1207 | GNUNET_DISK_PIPE_END_READ); | ||
1196 | child_death_task = NULL; | 1208 | child_death_task = NULL; |
1197 | tc = GNUNET_SCHEDULER_get_task_context (); | ||
1198 | if (0 == (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY)) | ||
1199 | { | ||
1200 | /* shutdown scheduled us, ignore! */ | ||
1201 | child_death_task = | ||
1202 | GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, | ||
1203 | pr, | ||
1204 | &maint_child_death, | ||
1205 | NULL); | ||
1206 | return; | ||
1207 | } | ||
1208 | /* consume the signal */ | 1209 | /* consume the signal */ |
1209 | GNUNET_break (0 < GNUNET_DISK_file_read (pr, &c, sizeof (c))); | 1210 | GNUNET_break (0 < GNUNET_DISK_file_read (pr, &c, sizeof (c))); |
1210 | 1211 | ||
@@ -1353,14 +1354,13 @@ maint_child_death (void *cls) | |||
1353 | } | 1354 | } |
1354 | else | 1355 | else |
1355 | { | 1356 | { |
1356 | if (0 == (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) | 1357 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
1357 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 1358 | _("Service `%s' terminated with status %s/%d, will restart in %s\n"), |
1358 | _("Service `%s' terminated with status %s/%d, will restart in %s\n"), | 1359 | pos->name, |
1359 | pos->name, | 1360 | statstr, |
1360 | statstr, | 1361 | statcode, |
1361 | statcode, | 1362 | GNUNET_STRINGS_relative_time_to_string (pos->backoff, |
1362 | GNUNET_STRINGS_relative_time_to_string (pos->backoff, | 1363 | GNUNET_YES)); |
1363 | GNUNET_YES)); | ||
1364 | /* schedule restart */ | 1364 | /* schedule restart */ |
1365 | pos->restart_at = GNUNET_TIME_relative_to_absolute (pos->backoff); | 1365 | pos->restart_at = GNUNET_TIME_relative_to_absolute (pos->backoff); |
1366 | pos->backoff = GNUNET_TIME_STD_BACKOFF (pos->backoff); | 1366 | pos->backoff = GNUNET_TIME_STD_BACKOFF (pos->backoff); |
@@ -1601,9 +1601,8 @@ run (void *cls, struct GNUNET_SERVER_Handle *serv, | |||
1601 | cfg = c; | 1601 | cfg = c; |
1602 | server = serv; | 1602 | server = serv; |
1603 | GNUNET_assert (NULL != serv); | 1603 | GNUNET_assert (NULL != serv); |
1604 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, | 1604 | GNUNET_SCHEDULER_add_shutdown (&shutdown_task, |
1605 | &shutdown_task, | 1605 | NULL); |
1606 | NULL); | ||
1607 | child_death_task = | 1606 | child_death_task = |
1608 | GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, | 1607 | GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, |
1609 | GNUNET_DISK_pipe_handle (sigpipe, | 1608 | GNUNET_DISK_pipe_handle (sigpipe, |
diff --git a/src/arm/test_arm_api.c b/src/arm/test_arm_api.c index 149ec46c4..f5283d714 100644 --- a/src/arm/test_arm_api.c +++ b/src/arm/test_arm_api.c | |||
@@ -157,7 +157,7 @@ arm_conn (void *cls, | |||
157 | ok = 3; | 157 | ok = 3; |
158 | else if (ok == 1) | 158 | else if (ok == 1) |
159 | ok = 0; | 159 | ok = 0; |
160 | GNUNET_SCHEDULER_add_now (trigger_disconnect, arm); | 160 | GNUNET_SCHEDULER_add_now (&trigger_disconnect, arm); |
161 | } | 161 | } |
162 | } | 162 | } |
163 | 163 | ||
diff --git a/src/arm/test_exponential_backoff.c b/src/arm/test_exponential_backoff.c index 1032a9010..3f33c91e6 100644 --- a/src/arm/test_exponential_backoff.c +++ b/src/arm/test_exponential_backoff.c | |||
@@ -90,7 +90,7 @@ struct ShutdownContext | |||
90 | /** | 90 | /** |
91 | * Task set up to cancel the shutdown request on timeout. | 91 | * Task set up to cancel the shutdown request on timeout. |
92 | */ | 92 | */ |
93 | struct GNUNET_SCHEDULER_Task * cancel_task; | 93 | struct GNUNET_SCHEDULER_Task *cancel_task; |
94 | 94 | ||
95 | /** | 95 | /** |
96 | * Task to call once shutdown complete | 96 | * Task to call once shutdown complete |
@@ -235,7 +235,7 @@ shutdown_cont (void *cls, int reason) | |||
235 | { | 235 | { |
236 | /* Re-try shutdown */ | 236 | /* Re-try shutdown */ |
237 | LOG ("do-nothing didn't die, trying again\n"); | 237 | LOG ("do-nothing didn't die, trying again\n"); |
238 | GNUNET_SCHEDULER_add_now (kill_task, NULL); | 238 | GNUNET_SCHEDULER_add_now (&kill_task, NULL); |
239 | return; | 239 | return; |
240 | } | 240 | } |
241 | startedWaitingAt = GNUNET_TIME_absolute_get (); | 241 | startedWaitingAt = GNUNET_TIME_absolute_get (); |
@@ -290,12 +290,15 @@ trigger_disconnect (void *cls) | |||
290 | 290 | ||
291 | 291 | ||
292 | static void | 292 | static void |
293 | arm_stop_cb (void *cls, enum GNUNET_ARM_RequestStatus status, const char *servicename, enum GNUNET_ARM_Result result) | 293 | arm_stop_cb (void *cls, |
294 | enum GNUNET_ARM_RequestStatus status, | ||
295 | const char *servicename, | ||
296 | enum GNUNET_ARM_Result result) | ||
294 | { | 297 | { |
295 | GNUNET_break (status == GNUNET_ARM_REQUEST_SENT_OK); | 298 | GNUNET_break (status == GNUNET_ARM_REQUEST_SENT_OK); |
296 | GNUNET_break (result == GNUNET_ARM_RESULT_STOPPED); | 299 | GNUNET_break (result == GNUNET_ARM_RESULT_STOPPED); |
297 | LOG ("ARM service stopped\n"); | 300 | LOG ("ARM service stopped\n"); |
298 | GNUNET_SCHEDULER_add_now (trigger_disconnect, NULL); | 301 | GNUNET_SCHEDULER_add_now (&trigger_disconnect, NULL); |
299 | } | 302 | } |
300 | 303 | ||
301 | 304 | ||
@@ -318,7 +321,8 @@ srv_status (void *cls, const char *service, enum GNUNET_ARM_ServiceStatus status | |||
318 | LOG ("do-nothing is starting\n"); | 321 | LOG ("do-nothing is starting\n"); |
319 | phase++; | 322 | phase++; |
320 | ok = 1; | 323 | ok = 1; |
321 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &kill_task, NULL); | 324 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, |
325 | &kill_task, NULL); | ||
322 | } | 326 | } |
323 | else if ((phase == 2) && (strcasecmp (SERVICE, service) == 0)) | 327 | else if ((phase == 2) && (strcasecmp (SERVICE, service) == 0)) |
324 | { | 328 | { |
@@ -328,7 +332,7 @@ srv_status (void *cls, const char *service, enum GNUNET_ARM_ServiceStatus status | |||
328 | if (status == GNUNET_ARM_SERVICE_STARTING) | 332 | if (status == GNUNET_ARM_SERVICE_STARTING) |
329 | { | 333 | { |
330 | LOG ("do-nothing is starting\n"); | 334 | LOG ("do-nothing is starting\n"); |
331 | GNUNET_SCHEDULER_add_now (kill_task, &ok); | 335 | GNUNET_SCHEDULER_add_now (&kill_task, &ok); |
332 | } | 336 | } |
333 | else if ((status == GNUNET_ARM_SERVICE_STOPPED) && (trialCount == 14)) | 337 | else if ((status == GNUNET_ARM_SERVICE_STOPPED) && (trialCount == 14)) |
334 | { | 338 | { |