From c9b8e5d0d1c38c48570be14216112201158503da Mon Sep 17 00:00:00 2001 From: bje Date: Wed, 22 Jul 1998 09:09:24 +0000 Subject: 1998-07-22 Ben Elliston * pthread.h (pthread_atfork): Add function prototype. * fork.c (pthread_atfork): Preliminary implementation. (_pthread_fork): Likewise. --- fork.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 fork.c (limited to 'fork.c') 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. */ +} -- cgit v1.2.3