diff options
Diffstat (limited to 'src/arm/gnunet-service-arm.c')
-rw-r--r-- | src/arm/gnunet-service-arm.c | 89 |
1 files changed, 44 insertions, 45 deletions
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, |