aboutsummaryrefslogtreecommitdiff
path: root/src/arm/gnunet-service-arm.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2016-04-30 08:17:37 +0000
committerChristian Grothoff <christian@grothoff.org>2016-04-30 08:17:37 +0000
commit95f9076a2139f5fb042b944a0658b6cda2fa35db (patch)
treeb0826a2a1dcf812e6b4450fe6b05d47cd53ae49d /src/arm/gnunet-service-arm.c
parent7746f68db77b9ca3c4aaca24ab2ce5253461240b (diff)
downloadgnunet-95f9076a2139f5fb042b944a0658b6cda2fa35db.tar.gz
gnunet-95f9076a2139f5fb042b944a0658b6cda2fa35db.zip
implementing new scheduler shutdown semantics
Diffstat (limited to 'src/arm/gnunet-service-arm.c')
-rw-r--r--src/arm/gnunet-service-arm.c89
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
1105delayed_restart_task (void *cls) 1120delayed_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)
1180static void 1192static void
1181maint_child_death (void *cls) 1193maint_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,