aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNils Durner <durner@gnunet.org>2010-03-22 21:50:38 +0000
committerNils Durner <durner@gnunet.org>2010-03-22 21:50:38 +0000
commit1d943b33c95c2d3f366d50e22e8b134029d5a579 (patch)
tree14f4831dd4102b7a80ed1656b2d6f9b1e2782747 /src
parente409833ea6360385d5c085643a9fa028f410d7e1 (diff)
downloadgnunet-1d943b33c95c2d3f366d50e22e8b134029d5a579.tar.gz
gnunet-1d943b33c95c2d3f366d50e22e8b134029d5a579.zip
Diffstat (limited to 'src')
-rw-r--r--src/arm/gnunet-service-arm.c2
-rw-r--r--src/include/platform.h2
-rw-r--r--src/util/os_priority.c30
-rw-r--r--src/util/signal.c15
4 files changed, 42 insertions, 7 deletions
diff --git a/src/arm/gnunet-service-arm.c b/src/arm/gnunet-service-arm.c
index 9eb7e7534..2cc131c1c 100644
--- a/src/arm/gnunet-service-arm.c
+++ b/src/arm/gnunet-service-arm.c
@@ -986,7 +986,7 @@ run (void *cls,
986 sched = s; 986 sched = s;
987 server = serv; 987 server = serv;
988 GNUNET_assert (serv != NULL); 988 GNUNET_assert (serv != NULL);
989 shc_chld = GNUNET_SIGNAL_handler_install (SIGCHLD, &sighandler_child_death); 989 shc_chld = GNUNET_SIGNAL_handler_install (GNUNET_SIGCHLD, &sighandler_child_death);
990 GNUNET_assert (sigpipe == NULL); 990 GNUNET_assert (sigpipe == NULL);
991 sigpipe = GNUNET_DISK_pipe (GNUNET_NO); 991 sigpipe = GNUNET_DISK_pipe (GNUNET_NO);
992 GNUNET_assert (sigpipe != NULL); 992 GNUNET_assert (sigpipe != NULL);
diff --git a/src/include/platform.h b/src/include/platform.h
index 0e6c13c21..7bf2b2f8f 100644
--- a/src/include/platform.h
+++ b/src/include/platform.h
@@ -40,8 +40,10 @@
40 40
41#ifdef WINDOWS 41#ifdef WINDOWS
42#define BREAKPOINT asm("int $3;"); 42#define BREAKPOINT asm("int $3;");
43#define GNUNET_SIGCHLD 17
43#else 44#else
44#define BREAKPOINT 45#define BREAKPOINT
46#define GNUNET_SIGCHLD SIGCHLD
45#endif 47#endif
46 48
47#ifdef HAVE_SYS_TYPES_H 49#ifdef HAVE_SYS_TYPES_H
diff --git a/src/util/os_priority.c b/src/util/os_priority.c
index d501b3511..b68e6b8fa 100644
--- a/src/util/os_priority.c
+++ b/src/util/os_priority.c
@@ -29,6 +29,27 @@
29#include "gnunet_os_lib.h" 29#include "gnunet_os_lib.h"
30#include "disk.h" 30#include "disk.h"
31 31
32#if WINDOWS
33#include "gnunet_signal_lib.h"
34
35extern GNUNET_SIGNAL_Handler w32_sigchld_handler;
36
37/**
38 * @brief Waits for a process to terminate and invokes the SIGCHLD handler
39 * @param h handle to the process
40 */
41static DWORD WINAPI
42ChildWaitThread (HANDLE h)
43{
44 WaitForSingleObject (h, INFINITE);
45
46 if (w32_sigchld_handler)
47 w32_sigchld_handler ();
48
49 CloseHandle (h);
50}
51#endif
52
32/** 53/**
33 * Set process priority 54 * Set process priority
34 * 55 *
@@ -274,9 +295,11 @@ GNUNET_OS_start_process (struct GNUNET_DISK_PipeHandle *pipe_stdin,
274 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "CreateProcess", fn); 295 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "CreateProcess", fn);
275 return -1; 296 return -1;
276 } 297 }
298
299 CreateThread (NULL, 64000, ChildWaitThread, proc.hProcess, 0, NULL);
300
277 if (fn != filename) 301 if (fn != filename)
278 GNUNET_free (fn); 302 GNUNET_free (fn);
279 CloseHandle (proc.hProcess);
280 CloseHandle (proc.hThread); 303 CloseHandle (proc.hThread);
281 304
282 GNUNET_free (cmd); 305 GNUNET_free (cmd);
@@ -365,9 +388,10 @@ GNUNET_OS_start_process_v (const char *filename, char *const argv[])
365 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "fork"); 388 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "fork");
366 return -1; 389 return -1;
367 } 390 }
368 CloseHandle (proc.hProcess);
369 CloseHandle (proc.hThread);
370 391
392 CreateThread (NULL, 64000, ChildWaitThread, proc.hProcess, 0, NULL);
393
394 CloseHandle (proc.hThread);
371 GNUNET_free (cmd); 395 GNUNET_free (cmd);
372 396
373 return proc.dwProcessId; 397 return proc.dwProcessId;
diff --git a/src/util/signal.c b/src/util/signal.c
index 478551ca2..c8d6e04cd 100644
--- a/src/util/signal.c
+++ b/src/util/signal.c
@@ -39,8 +39,12 @@ struct GNUNET_SIGNAL_Context
39#endif 39#endif
40}; 40};
41 41
42#ifdef WINDOWS
43GNUNET_SIGNAL_Handler w32_sigchld_handler = NULL;
44#endif
45
42struct GNUNET_SIGNAL_Context * 46struct GNUNET_SIGNAL_Context *
43GNUNET_SIGNAL_handler_install (int signal, GNUNET_SIGNAL_Handler handler) 47GNUNET_SIGNAL_handler_install (int signum, GNUNET_SIGNAL_Handler handler)
44{ 48{
45 struct GNUNET_SIGNAL_Context *ret; 49 struct GNUNET_SIGNAL_Context *ret;
46#ifndef MINGW 50#ifndef MINGW
@@ -48,7 +52,7 @@ GNUNET_SIGNAL_handler_install (int signal, GNUNET_SIGNAL_Handler handler)
48#endif 52#endif
49 53
50 ret = GNUNET_malloc (sizeof (struct GNUNET_SIGNAL_Context)); 54 ret = GNUNET_malloc (sizeof (struct GNUNET_SIGNAL_Context));
51 ret->sig = signal; 55 ret->sig = signum;
52 ret->method = handler; 56 ret->method = handler;
53#ifndef MINGW 57#ifndef MINGW
54 sig.sa_handler = (void *) handler; 58 sig.sa_handler = (void *) handler;
@@ -58,7 +62,12 @@ GNUNET_SIGNAL_handler_install (int signal, GNUNET_SIGNAL_Handler handler)
58#else 62#else
59 sig.sa_flags = SA_RESTART; 63 sig.sa_flags = SA_RESTART;
60#endif 64#endif
61 sigaction (signal, &sig, &ret->oldsig); 65 sigaction (signum, &sig, &ret->oldsig);
66#else
67 if (signum == GNUNET_SIGCHLD)
68 w32_sigchld_handler = handler;
69 else
70 signal (signum, handler);
62#endif 71#endif
63 return ret; 72 return ret;
64} 73}