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);
#ifdef WINDOWS
#define BREAKPOINT asm("int $3;");
+#define GNUNET_SIGCHLD 17
#else
#define BREAKPOINT
+#define GNUNET_SIGCHLD SIGCHLD
#endif
#ifdef HAVE_SYS_TYPES_H
#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
*
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);
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;
#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
#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;
#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;
}