gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r10679 - in gnunet/src: arm include util


From: gnunet
Subject: [GNUnet-SVN] r10679 - in gnunet/src: arm include util
Date: Mon, 22 Mar 2010 22:50:38 +0100

Author: durner
Date: 2010-03-22 22:50:38 +0100 (Mon, 22 Mar 2010)
New Revision: 10679

Modified:
   gnunet/src/arm/gnunet-service-arm.c
   gnunet/src/include/platform.h
   gnunet/src/util/os_priority.c
   gnunet/src/util/signal.c
Log:


Modified: gnunet/src/arm/gnunet-service-arm.c
===================================================================
--- gnunet/src/arm/gnunet-service-arm.c 2010-03-22 20:24:49 UTC (rev 10678)
+++ gnunet/src/arm/gnunet-service-arm.c 2010-03-22 21:50:38 UTC (rev 10679)
@@ -986,7 +986,7 @@
   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);

Modified: gnunet/src/include/platform.h
===================================================================
--- gnunet/src/include/platform.h       2010-03-22 20:24:49 UTC (rev 10678)
+++ gnunet/src/include/platform.h       2010-03-22 21:50:38 UTC (rev 10679)
@@ -40,8 +40,10 @@
 
 #ifdef WINDOWS
 #define BREAKPOINT asm("int $3;");
+#define GNUNET_SIGCHLD 17
 #else
 #define BREAKPOINT
+#define GNUNET_SIGCHLD SIGCHLD
 #endif
 
 #ifdef HAVE_SYS_TYPES_H

Modified: gnunet/src/util/os_priority.c
===================================================================
--- gnunet/src/util/os_priority.c       2010-03-22 20:24:49 UTC (rev 10678)
+++ gnunet/src/util/os_priority.c       2010-03-22 21:50:38 UTC (rev 10679)
@@ -29,7 +29,28 @@
 #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
  *
  * @param proc id of the process
@@ -274,9 +295,11 @@
       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_log_strerror (GNUNET_ERROR_TYPE_ERROR, "fork");
       return -1;
     }
-  CloseHandle (proc.hProcess);
+
+  CreateThread (NULL, 64000, ChildWaitThread, proc.hProcess, 0, NULL);
+
   CloseHandle (proc.hThread);
-
   GNUNET_free (cmd);
 
   return proc.dwProcessId;

Modified: gnunet/src/util/signal.c
===================================================================
--- gnunet/src/util/signal.c    2010-03-22 20:24:49 UTC (rev 10678)
+++ gnunet/src/util/signal.c    2010-03-22 21:50:38 UTC (rev 10679)
@@ -39,8 +39,12 @@
 #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 @@
 #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 @@
 #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;
 }





reply via email to

[Prev in Thread] Current Thread [Next in Thread]