aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/util.c40
-rw-r--r--src/common/util.h7
2 files changed, 47 insertions, 0 deletions
diff --git a/src/common/util.c b/src/common/util.c
index cde1cb33b..84f623301 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -18,6 +18,13 @@
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <assert.h>
#include "util.h"
#include "log.h"
@@ -107,3 +114,36 @@ void set_socket_nonblocking(int socket)
fcntl(socket, F_SETFL, O_NONBLOCK);
#endif
}
+
+int spawn_func(int (*func)(void *), void *data)
+{
+#ifdef _MSC_VER
+ int rv;
+ rv = _beginthread(func, 0, data);
+ if (rv == (unsigned long) -1)
+ return -1;
+ return 0;
+#else
+ pid_t pid;
+ pid = fork();
+ if (pid<0)
+ return -1;
+ if (pid==0) {
+ /* Child */
+ func(data);
+ assert(0); /* Should never reach here. */
+ } else {
+ /* Parent */
+ return 0;
+ }
+#endif
+}
+
+void spawn_exit()
+{
+#ifdef _MSC_VER
+ _endthread();
+#else
+ exit(0);
+#endif
+}
diff --git a/src/common/util.h b/src/common/util.h
index eb175c961..ee3c6eba4 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -45,4 +45,11 @@ int tv_cmp(struct timeval *a, struct timeval *b);
void set_socket_nonblocking(int socket);
+/* Minimalist interface to run a void function in the background. On
+ unix calls fork, on win32 calls beginthread. Returns -1 on failure.
+ func should not return, but rather should call spawn_exit.
+*/
+int spawn_func(int (*func)(void *), void *data);
+void spawn_exit();
+
#endif