diff options
author | Christian Grothoff <christian@grothoff.org> | 2021-09-23 22:52:20 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2021-09-23 22:52:20 +0200 |
commit | 8f18cbcaf6025d40fa1d400f5a4e702ad957809a (patch) | |
tree | d6cf2493590f5fd0091c17b6e30bda7ca56fbf9a /src/util | |
parent | b2cf59bdd77a76cdbeade6e948ca39e1085def35 (diff) | |
download | gnunet-8f18cbcaf6025d40fa1d400f5a4e702ad957809a.tar.gz gnunet-8f18cbcaf6025d40fa1d400f5a4e702ad957809a.zip |
-add first dhtu test skeleton
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/child_management.c | 47 |
1 files changed, 18 insertions, 29 deletions
diff --git a/src/util/child_management.c b/src/util/child_management.c index 3afd682b9..4ef42dba2 100644 --- a/src/util/child_management.c +++ b/src/util/child_management.c | |||
@@ -91,15 +91,10 @@ maint_child_death (void *cls) | |||
91 | 91 | ||
92 | (void) cls; | 92 | (void) cls; |
93 | sig_task = NULL; | 93 | sig_task = NULL; |
94 | |||
95 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
96 | "Received SIGCHLD.\n"); | ||
97 | |||
98 | /* drain pipe */ | 94 | /* drain pipe */ |
99 | pr = GNUNET_DISK_pipe_handle (sigpipe, | 95 | pr = GNUNET_DISK_pipe_handle (sigpipe, |
100 | GNUNET_DISK_PIPE_END_READ); | 96 | GNUNET_DISK_PIPE_END_READ); |
101 | GNUNET_assert (! GNUNET_DISK_handle_invalid (pr)); | 97 | GNUNET_assert (! GNUNET_DISK_handle_invalid (pr)); |
102 | |||
103 | (void) GNUNET_DISK_file_read (pr, | 98 | (void) GNUNET_DISK_file_read (pr, |
104 | buf, | 99 | buf, |
105 | sizeof(buf)); | 100 | sizeof(buf)); |
@@ -159,9 +154,8 @@ sighandler_child_death (void) | |||
159 | } | 154 | } |
160 | 155 | ||
161 | 156 | ||
162 | // void __attribute__ ((constructor)) | ||
163 | static void | 157 | static void |
164 | child_management_start () | 158 | child_management_start (void) |
165 | { | 159 | { |
166 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 160 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
167 | "Trying to start child management.\n"); | 161 | "Trying to start child management.\n"); |
@@ -170,19 +164,24 @@ child_management_start () | |||
170 | sigpipe = GNUNET_DISK_pipe (GNUNET_DISK_PF_NONE); | 164 | sigpipe = GNUNET_DISK_pipe (GNUNET_DISK_PF_NONE); |
171 | GNUNET_assert (sigpipe != NULL); | 165 | GNUNET_assert (sigpipe != NULL); |
172 | shc_chld = | 166 | shc_chld = |
173 | GNUNET_SIGNAL_handler_install (GNUNET_SIGCHLD, &sighandler_child_death); | 167 | GNUNET_SIGNAL_handler_install (GNUNET_SIGCHLD, |
168 | &sighandler_child_death); | ||
174 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 169 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
175 | "Child management started.\n"); | 170 | "Child management started.\n"); |
176 | } | 171 | } |
177 | 172 | ||
173 | |||
178 | /** | 174 | /** |
179 | * Clean up. | 175 | * Clean up. |
180 | */ | 176 | */ |
181 | // void __attribute__ ((destructor)) | ||
182 | static void | 177 | static void |
183 | child_management_done () | 178 | child_management_done (void) |
184 | { | 179 | { |
185 | GNUNET_assert (NULL == sig_task); | 180 | if (NULL != sig_task) |
181 | { | ||
182 | GNUNET_SCHEDULER_cancel (sig_task); | ||
183 | sig_task = NULL; | ||
184 | } | ||
186 | GNUNET_SIGNAL_handler_uninstall (shc_chld); | 185 | GNUNET_SIGNAL_handler_uninstall (shc_chld); |
187 | shc_chld = NULL; | 186 | shc_chld = NULL; |
188 | GNUNET_DISK_pipe_close (sigpipe); | 187 | GNUNET_DISK_pipe_close (sigpipe); |
@@ -191,6 +190,7 @@ child_management_done () | |||
191 | "Child management stopped.\n"); | 190 | "Child management stopped.\n"); |
192 | } | 191 | } |
193 | 192 | ||
193 | |||
194 | struct GNUNET_ChildWaitHandle * | 194 | struct GNUNET_ChildWaitHandle * |
195 | GNUNET_wait_child (struct GNUNET_OS_Process *proc, | 195 | GNUNET_wait_child (struct GNUNET_OS_Process *proc, |
196 | GNUNET_ChildCompletedCallback cb, | 196 | GNUNET_ChildCompletedCallback cb, |
@@ -198,9 +198,6 @@ GNUNET_wait_child (struct GNUNET_OS_Process *proc, | |||
198 | { | 198 | { |
199 | struct GNUNET_ChildWaitHandle *cwh; | 199 | struct GNUNET_ChildWaitHandle *cwh; |
200 | 200 | ||
201 | LOG (GNUNET_ERROR_TYPE_ERROR, | ||
202 | "Adding child!\n"); | ||
203 | |||
204 | child_management_start (); | 201 | child_management_start (); |
205 | cwh = GNUNET_new (struct GNUNET_ChildWaitHandle); | 202 | cwh = GNUNET_new (struct GNUNET_ChildWaitHandle); |
206 | cwh->proc = proc; | 203 | cwh->proc = proc; |
@@ -221,23 +218,15 @@ GNUNET_wait_child (struct GNUNET_OS_Process *proc, | |||
221 | return cwh; | 218 | return cwh; |
222 | } | 219 | } |
223 | 220 | ||
221 | |||
224 | void | 222 | void |
225 | GNUNET_wait_child_cancel (struct GNUNET_ChildWaitHandle *cwh) | 223 | GNUNET_wait_child_cancel (struct GNUNET_ChildWaitHandle *cwh) |
226 | { | 224 | { |
227 | if ((NULL != cwh_head)) | 225 | GNUNET_CONTAINER_DLL_remove (cwh_head, |
228 | { | 226 | cwh_tail, |
229 | GNUNET_CONTAINER_DLL_remove (cwh_head, | 227 | cwh); |
230 | cwh_tail, | ||
231 | cwh); | ||
232 | } | ||
233 | if (NULL == cwh_head) | ||
234 | { | ||
235 | child_management_done (); | ||
236 | } | ||
237 | if (NULL != sig_task) | ||
238 | { | ||
239 | GNUNET_SCHEDULER_cancel (sig_task); | ||
240 | sig_task = NULL; | ||
241 | } | ||
242 | GNUNET_free (cwh); | 228 | GNUNET_free (cwh); |
229 | if (NULL != cwh_head) | ||
230 | return; | ||
231 | child_management_done (); | ||
243 | } | 232 | } |