瀏覽代碼

Add abstraction for fork vs thread.

svn:r387
Nick Mathewson 21 年之前
父節點
當前提交
e4a6ea5c46
共有 2 個文件被更改,包括 47 次插入0 次删除
  1. 40 0
      src/common/util.c
  2. 7 0
      src/common/util.h

+ 40 - 0
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
+}

+ 7 - 0
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