(no commit message)
authorNils Durner <durner@gnunet.org>
Mon, 22 Mar 2010 21:50:38 +0000 (21:50 +0000)
committerNils Durner <durner@gnunet.org>
Mon, 22 Mar 2010 21:50:38 +0000 (21:50 +0000)
src/arm/gnunet-service-arm.c
src/include/platform.h
src/util/os_priority.c
src/util/signal.c

index 9eb7e75341ea7f2a298e9b8e1e8192facf08245d..2cc131c1c5a3a7c6c2193feab09883d3bf00af0d 100644 (file)
@@ -986,7 +986,7 @@ run (void *cls,
   sched = s;
   server = serv;
   GNUNET_assert (serv != NULL);
-  shc_chld = GNUNET_SIGNAL_handler_install (SIGCHLD, &sighandler_child_death);
+  shc_chld = GNUNET_SIGNAL_handler_install (GNUNET_SIGCHLD, &sighandler_child_death);
   GNUNET_assert (sigpipe == NULL);
   sigpipe = GNUNET_DISK_pipe (GNUNET_NO);
   GNUNET_assert (sigpipe != NULL);
index 0e6c13c21f12947285c4bec295a6b6f1e219f1e6..7bf2b2f8f69f546f82f17fe3beac251ceffce21a 100644 (file)
 
 #ifdef WINDOWS
 #define BREAKPOINT asm("int $3;");
+#define GNUNET_SIGCHLD 17
 #else
 #define BREAKPOINT
+#define GNUNET_SIGCHLD SIGCHLD
 #endif
 
 #ifdef HAVE_SYS_TYPES_H
index d501b3511fcfe76b196cbcf41179543e0db2daa6..b68e6b8fac1547ed370503d396c7f1fc776e932b 100644 (file)
 #include "gnunet_os_lib.h"
 #include "disk.h"
 
+#if WINDOWS
+#include "gnunet_signal_lib.h"
+
+extern GNUNET_SIGNAL_Handler w32_sigchld_handler;
+
+/**
+ * @brief Waits for a process to terminate and invokes the SIGCHLD handler
+ * @param h handle to the process
+ */
+static DWORD WINAPI
+ChildWaitThread (HANDLE h)
+{
+  WaitForSingleObject (h, INFINITE);
+
+  if (w32_sigchld_handler)
+    w32_sigchld_handler ();
+
+  CloseHandle (h);
+}
+#endif
+
 /**
  * Set process priority
  *
@@ -274,9 +295,11 @@ GNUNET_OS_start_process (struct GNUNET_DISK_PipeHandle *pipe_stdin,
       GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "CreateProcess", fn);
       return -1;
     }
+
+  CreateThread (NULL, 64000, ChildWaitThread, proc.hProcess, 0, NULL);
+
   if (fn != filename)
     GNUNET_free (fn);
-  CloseHandle (proc.hProcess);
   CloseHandle (proc.hThread);
 
   GNUNET_free (cmd);
@@ -365,9 +388,10 @@ GNUNET_OS_start_process_v (const char *filename, char *const argv[])
       GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "fork");
       return -1;
     }
-  CloseHandle (proc.hProcess);
-  CloseHandle (proc.hThread);
 
+  CreateThread (NULL, 64000, ChildWaitThread, proc.hProcess, 0, NULL);
+
+  CloseHandle (proc.hThread);
   GNUNET_free (cmd);
 
   return proc.dwProcessId;
index 478551ca28d535dc150df4249d516420729c3dcd..c8d6e04cd4a2ea446b12f5da9d941a4f9fa26b9e 100644 (file)
@@ -39,8 +39,12 @@ struct GNUNET_SIGNAL_Context
 #endif
 };
 
+#ifdef WINDOWS
+GNUNET_SIGNAL_Handler w32_sigchld_handler = NULL;
+#endif
+
 struct GNUNET_SIGNAL_Context *
-GNUNET_SIGNAL_handler_install (int signal, GNUNET_SIGNAL_Handler handler)
+GNUNET_SIGNAL_handler_install (int signum, GNUNET_SIGNAL_Handler handler)
 {
   struct GNUNET_SIGNAL_Context *ret;
 #ifndef MINGW
@@ -48,7 +52,7 @@ GNUNET_SIGNAL_handler_install (int signal, GNUNET_SIGNAL_Handler handler)
 #endif
 
   ret = GNUNET_malloc (sizeof (struct GNUNET_SIGNAL_Context));
-  ret->sig = signal;
+  ret->sig = signum;
   ret->method = handler;
 #ifndef MINGW
   sig.sa_handler = (void *) handler;
@@ -58,7 +62,12 @@ GNUNET_SIGNAL_handler_install (int signal, GNUNET_SIGNAL_Handler handler)
 #else
   sig.sa_flags = SA_RESTART;
 #endif
-  sigaction (signal, &sig, &ret->oldsig);
+  sigaction (signum, &sig, &ret->oldsig);
+#else
+  if (signum == GNUNET_SIGCHLD)
+    w32_sigchld_handler = handler;
+  else
+    signal (signum, handler);
 #endif
   return ret;
 }