aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2021-09-23 22:52:20 +0200
committerChristian Grothoff <christian@grothoff.org>2021-09-23 22:52:20 +0200
commit8f18cbcaf6025d40fa1d400f5a4e702ad957809a (patch)
treed6cf2493590f5fd0091c17b6e30bda7ca56fbf9a /src/util
parentb2cf59bdd77a76cdbeade6e948ca39e1085def35 (diff)
downloadgnunet-8f18cbcaf6025d40fa1d400f5a4e702ad957809a.tar.gz
gnunet-8f18cbcaf6025d40fa1d400f5a4e702ad957809a.zip
-add first dhtu test skeleton
Diffstat (limited to 'src/util')
-rw-r--r--src/util/child_management.c47
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))
163static void 157static void
164child_management_start () 158child_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))
182static void 177static void
183child_management_done () 178child_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
194struct GNUNET_ChildWaitHandle * 194struct GNUNET_ChildWaitHandle *
195GNUNET_wait_child (struct GNUNET_OS_Process *proc, 195GNUNET_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
224void 222void
225GNUNET_wait_child_cancel (struct GNUNET_ChildWaitHandle *cwh) 223GNUNET_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}