[or-cvs] Add abstraction for fork vs thread.

Nick Mathewson nickm at seul.org
Tue Aug 12 07:01:22 UTC 2003


Update of /home/or/cvsroot/src/common
In directory moria.mit.edu:/tmp/cvs-serv31416/src/common

Modified Files:
	util.c util.h 
Log Message:
Add abstraction for fork vs thread.

Index: util.c
===================================================================
RCS file: /home/or/cvsroot/src/common/util.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- util.c	12 Aug 2003 03:16:14 -0000	1.9
+++ util.c	12 Aug 2003 07:01:20 -0000	1.10
@@ -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"
@@ -105,5 +112,38 @@
 	ioctlsocket(socket, FIONBIO, (unsigned long*) &nonblocking);
 #else
 	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: util.h
===================================================================
RCS file: /home/or/cvsroot/src/common/util.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- util.h	12 Aug 2003 03:16:14 -0000	1.4
+++ util.h	12 Aug 2003 07:01:20 -0000	1.5
@@ -45,4 +45,11 @@
 
 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



More information about the tor-commits mailing list