[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] Add abstraction for fork vs thread.
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