diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | fork.c | 64 | ||||
-rw-r--r-- | pthread.h | 4 |
3 files changed, 75 insertions, 0 deletions
@@ -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. @@ -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. */ +} @@ -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 *), |