diff options
author | Nils Durner <durner@gnunet.org> | 2010-03-22 21:50:38 +0000 |
---|---|---|
committer | Nils Durner <durner@gnunet.org> | 2010-03-22 21:50:38 +0000 |
commit | 1d943b33c95c2d3f366d50e22e8b134029d5a579 (patch) | |
tree | 14f4831dd4102b7a80ed1656b2d6f9b1e2782747 | |
parent | e409833ea6360385d5c085643a9fa028f410d7e1 (diff) | |
download | gnunet-1d943b33c95c2d3f366d50e22e8b134029d5a579.tar.gz gnunet-1d943b33c95c2d3f366d50e22e8b134029d5a579.zip |
-rw-r--r-- | src/arm/gnunet-service-arm.c | 2 | ||||
-rw-r--r-- | src/include/platform.h | 2 | ||||
-rw-r--r-- | src/util/os_priority.c | 30 | ||||
-rw-r--r-- | src/util/signal.c | 15 |
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 | |||
35 | extern 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 | */ | ||
41 | static DWORD WINAPI | ||
42 | ChildWaitThread (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 | ||
43 | GNUNET_SIGNAL_Handler w32_sigchld_handler = NULL; | ||
44 | #endif | ||
45 | |||
42 | struct GNUNET_SIGNAL_Context * | 46 | struct GNUNET_SIGNAL_Context * |
43 | GNUNET_SIGNAL_handler_install (int signal, GNUNET_SIGNAL_Handler handler) | 47 | GNUNET_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 | } |