summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--fork.c64
-rw-r--r--pthread.h4
3 files changed, 75 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index ba6e725..35b3d82 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+1998-07-22 Ben Elliston <bje@cygnus.com>
+
+ * pthread.h (pthread_atfork): Add function prototype.
+
+ * fork.c (pthread_atfork): Preliminary implementation.
+ (_pthread_fork): Likewise.
+
Wed Jul 22 00:16:22 1998 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
* cleanup.c (_pthread_cleanup_push): Implement.
diff --git a/fork.c b/fork.c
new file mode 100644
index 0000000..0b27558
--- /dev/null
+++ b/fork.c
@@ -0,0 +1,64 @@
+/*
+ * fork.c
+ *
+ * Description:
+ * Implementation of fork() for POSIX threads.
+ */
+
+int
+pthread_atfork(void (*prepare)(void),
+ void (*parent)(void),
+ void (*child)(void))
+{
+ /* Push handlers (unless NULL) onto their respective stacks. */
+
+ if (prepare != NULL)
+ {
+ /* Push prepare. */
+ /* If push fails, return ENOMEM. */
+ }
+
+ if (parent != NULL)
+ {
+ /* Push parent. */
+ /* If push fails, return ENOMEM. */
+ }
+
+ if (child != NULL)
+ {
+ /* Push child. */
+ /* If push fails, return ENOMEM. */
+ }
+
+ /* Everything is okay. */
+ return 0;
+}
+
+/* It looks like the GNU linker is capable of selecting this version of
+ fork() over a version provided in more primitive libraries further down
+ the linker command line. */
+
+pid_t
+fork()
+{
+ pid_t pid;
+
+ /* Pop prepare handlers here. */
+
+ /* Now call Cygwin32's fork(). */
+
+ if ((pid = _fork()) > 0)
+ {
+ /* Pop parent handlers. */
+ return pid;
+ }
+ else
+ {
+ /* Pop child handlers. */
+ /* Terminate all threads except pthread_self() using
+ pthread_cancel(). */
+ return 0;
+ }
+
+ /* Not reached. */
+}
diff --git a/pthread.h b/pthread.h
index bf9ff7b..82b1a93 100644
--- a/pthread.h
+++ b/pthread.h
@@ -51,6 +51,10 @@ typedef struct {
extern "C" {
#endif /* __cplusplus */
+int pthread_atfork (void (*prepare)(void),
+ void (*parent)(void),
+ void (*child)(void));
+
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void * (*start_routine) (void *),