]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Add abstraction for fork vs thread.
authorNick Mathewson <nickm@torproject.org>
Tue, 12 Aug 2003 07:01:20 +0000 (07:01 +0000)
committerNick Mathewson <nickm@torproject.org>
Tue, 12 Aug 2003 07:01:20 +0000 (07:01 +0000)
svn:r387

src/common/util.c
src/common/util.h

index cde1cb33bd0696d25380820788bedfa62dd5eccf..84f623301f507a05972866c2beed71ae1d3d6260 100644 (file)
 #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
+}
index eb175c961fd683a04c4770a9e9db8b3adef29d76..ee3c6eba48243b4e5e794b0e4cacf0410b13dfb7 100644 (file)
@@ -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