summaryrefslogtreecommitdiff
path: root/lib/libc_r
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc_r')
-rw-r--r--lib/libc_r/TEST/test_fork.c60
-rw-r--r--lib/libc_r/man/Makefile.inc6
-rw-r--r--lib/libc_r/man/pthread_atfork.368
-rw-r--r--lib/libc_r/uthread/Makefile.inc5
-rw-r--r--lib/libc_r/uthread/pthread_private.h7
-rw-r--r--lib/libc_r/uthread/uthread_atfork.c93
-rw-r--r--lib/libc_r/uthread/uthread_fork.c10
7 files changed, 10 insertions, 239 deletions
diff --git a/lib/libc_r/TEST/test_fork.c b/lib/libc_r/TEST/test_fork.c
index bf0cc583c80..ab53ec41d4c 100644
--- a/lib/libc_r/TEST/test_fork.c
+++ b/lib/libc_r/TEST/test_fork.c
@@ -47,51 +47,6 @@ sigchld(sig)
SUCCEED;
}
-static int atfork_state = 0;
-
-void
-atfork_child2()
-{
- ASSERT(atfork_state++ == 3);
- ASSERT(getpid() != parent_pid);
-}
-
-void
-atfork_parent2()
-{
- ASSERT(atfork_state++ == 3);
- ASSERT(getpid() == parent_pid);
-}
-
-void
-atfork_prepare2()
-{
- ASSERT(atfork_state++ == 0);
- ASSERT(getpid() == parent_pid);
-}
-
-
-void
-atfork_child1()
-{
- ASSERT(atfork_state++ == 2);
- ASSERT(getpid() != parent_pid);
-}
-
-void
-atfork_parent1()
-{
- ASSERT(atfork_state++ == 2);
- ASSERT(getpid() == parent_pid);
-}
-
-void
-atfork_prepare1()
-{
- ASSERT(atfork_state++ == 1);
- ASSERT(getpid() == parent_pid);
-}
-
int
main()
{
@@ -112,36 +67,27 @@ main()
CHECKe(signal(SIGCHLD, sigchld));
- /* Install some atfork handlers */
-
- CHECKr(pthread_atfork(&atfork_prepare1, &atfork_parent1,
- &atfork_child1));
- CHECKr(pthread_atfork(&atfork_prepare2, &atfork_parent2,
- &atfork_child2));
-
- printf("forking\n");
+ printf("forking from pid %d\n", getpid());
CHECKe(pid = fork());
switch(pid) {
case 0:
/* child: */
+ printf("child = pid %d\n", getpid());
/* Our pid should change */
ASSERT(getpid() != parent_pid);
/* Our sleeper thread should have disappeared */
ASSERT(ESRCH == pthread_cancel(sleeper_thread));
- /* The atfork handler should have run */
- ASSERT(atfork_state++ == 4);
printf("child ok\n");
_exit(0);
PANIC("child _exit");
default:
/* parent: */
+ printf("parent = pid %d\n", getpid());
/* Our pid should stay the same */
ASSERT(getpid() == parent_pid);
/* Our sleeper thread should still be around */
CHECKr(pthread_cancel(sleeper_thread));
- /* The atfork handler should have run */
- ASSERT(atfork_state++ == 4);
/* wait for the SIGCHLD from the child */
CHECKe(pause());
PANIC("pause");
diff --git a/lib/libc_r/man/Makefile.inc b/lib/libc_r/man/Makefile.inc
index 55b37d24f48..c51d8ad23cc 100644
--- a/lib/libc_r/man/Makefile.inc
+++ b/lib/libc_r/man/Makefile.inc
@@ -1,11 +1,11 @@
-# $Id: Makefile.inc,v 1.5 1999/03/24 00:46:23 d Exp $
-# $OpenBSD: Makefile.inc,v 1.5 1999/03/24 00:46:23 d Exp $
+# $Id: Makefile.inc,v 1.6 1999/06/15 00:07:40 d Exp $
+# $OpenBSD: Makefile.inc,v 1.6 1999/06/15 00:07:40 d Exp $
# POSIX thread man files
.PATH: ${.CURDIR}/man
-MAN+= pthread_atfork.3 \
+MAN+= \
pthread_cleanup_pop.3 \
pthread_cleanup_push.3 \
pthread_cond_broadcast.3 \
diff --git a/lib/libc_r/man/pthread_atfork.3 b/lib/libc_r/man/pthread_atfork.3
deleted file mode 100644
index 1e56409ce51..00000000000
--- a/lib/libc_r/man/pthread_atfork.3
+++ /dev/null
@@ -1,68 +0,0 @@
-.Dd January 17, 1999
-.Dt PTHREAD_ATFORK 3
-.Os
-.Sh NAME
-.Nm pthread_atfork
-.Nd specify handler functions to call when the process forks
-.Sh SYNOPSIS
-.Fd #include <pthread.h>
-.Ft int
-.Fn pthread_atfork "void (*prepare)(void)" "void (*parent)(void)" "void (*child)(void)"
-.Sh DESCRIPTION
-The
-.Fn pthread_atfork
-function declares fork handlers to be called before and after
-.Fn fork ,
-in the context of the thread that called
-.Fn fork .
-The
-.Fa prepare
-fork handler will be called before
-.Fn fork
-processing commences. The
-.Fa parent
-fork handler will be called after
-.Fn fork
-prcessing completes in the parent process. The
-.Fa child
-fork handler will be called after
-.Fn fork
-processing completes in the child process. If no handling is desired at
-one or more of these three points, the correspoding fork handler
-address(es) may be set to
-.Dv NULL .
-.Pp
-The order of calls to
-.Fn pthread_atfork
-is significant. The
-.Fa parent
-and
-.Fa child
-fork handlers will be called in the order in which they were established
-by calls to
-.Fn pthread_atfork .
-The
-.Fa prepare
-fork handlers will be called in the opposite order.
-.Sh RETURN VALUES
-Upon successful completion,
-.Fn pthread_atfork
-will return a value of zero. Otherwise, an error number will be
-returned to indicate the error.
-.Sh ERRORS
-.Fn pthread_atfork
-will fail if:
-.Bl -tag -width Er
-.It Bq Er ENOMEM
-Insufficient table space exists to record the fork handler addresses.
-None of the handler lists are modified.
-.El
-.Pp
-.Sh SEE ALSO
-.Xr fork 2 ,
-.Xr atexit 3
-.Sh STANDARDS
-.Fn pthread_atfork
-conforms to ISO/IEC 9945-1 ANSI/IEEE
-.Pq Dq Tn POSIX
-Std 1003.1 Second Edition 1996-07-12.
diff --git a/lib/libc_r/uthread/Makefile.inc b/lib/libc_r/uthread/Makefile.inc
index 22bfb740e07..56a6b0046ba 100644
--- a/lib/libc_r/uthread/Makefile.inc
+++ b/lib/libc_r/uthread/Makefile.inc
@@ -1,5 +1,5 @@
-# $Id: Makefile.inc,v 1.7 1999/05/26 00:18:21 d Exp $
-# $OpenBSD: Makefile.inc,v 1.7 1999/05/26 00:18:21 d Exp $
+# $Id: Makefile.inc,v 1.8 1999/06/15 00:07:39 d Exp $
+# $OpenBSD: Makefile.inc,v 1.8 1999/06/15 00:07:39 d Exp $
# uthread sources
.PATH: ${.CURDIR}/uthread
@@ -8,7 +8,6 @@ CFLAGS += -I${.CURDIR}/arch/${MACHINE_ARCH}
SRCS+= \
uthread_accept.c \
- uthread_atfork.c \
uthread_attr_destroy.c \
uthread_attr_init.c \
uthread_attr_getdetachstate.c \
diff --git a/lib/libc_r/uthread/pthread_private.h b/lib/libc_r/uthread/pthread_private.h
index ef7b7e838e2..748485bc454 100644
--- a/lib/libc_r/uthread/pthread_private.h
+++ b/lib/libc_r/uthread/pthread_private.h
@@ -31,7 +31,7 @@
*
* Private thread definitions for the uthread kernel.
*
- * $OpenBSD: pthread_private.h,v 1.15 1999/06/09 07:06:54 d Exp $
+ * $OpenBSD: pthread_private.h,v 1.16 1999/06/15 00:07:39 d Exp $
*
*/
@@ -301,10 +301,6 @@ struct pthread_attr {
#define PTHREAD_MIN_PRIORITY 0
#define _POSIX_THREAD_ATTR_STACKSIZE
-#define PTHREAD_ATFORK_PREPARE 0
-#define PTHREAD_ATFORK_PARENT 1
-#define PTHREAD_ATFORK_CHILD 2
-
/*
* Clock resolution in nanoseconds.
*/
@@ -784,7 +780,6 @@ pthread_addr_t _thread_gc(pthread_addr_t);
void _thread_enter_cancellation_point(void);
void _thread_leave_cancellation_point(void);
void _thread_cancellation_point(void);
-void _thread_atfork(int);
int _thread_slow_atomic_lock(volatile _spinlock_lock_t *);
int _thread_slow_atomic_is_locked(volatile _spinlock_lock_t *);
diff --git a/lib/libc_r/uthread/uthread_atfork.c b/lib/libc_r/uthread/uthread_atfork.c
deleted file mode 100644
index a3ea65e8288..00000000000
--- a/lib/libc_r/uthread/uthread_atfork.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * David Leonard <d@openbsd.org>, 1999. Public domain.
- * $OpenBSD: uthread_atfork.c,v 1.1 1999/01/17 23:46:26 d Exp $
- */
-
-#include <stdlib.h>
-#include <sys/queue.h>
-#ifdef _THREAD_SAFE
-#include <pthread.h>
-#include "pthread_private.h"
-
-struct atfork_entry {
- void (*handler)(void);
- TAILQ_ENTRY(atfork_entry) entries;
-};
-
-static TAILQ_HEAD(atfork_list, atfork_entry) atfork_head[3] =
- { TAILQ_HEAD_INITIALIZER(atfork_head[PTHREAD_ATFORK_PREPARE]),
- TAILQ_HEAD_INITIALIZER(atfork_head[PTHREAD_ATFORK_PARENT]),
- TAILQ_HEAD_INITIALIZER(atfork_head[PTHREAD_ATFORK_CHILD]) };
-
-void
-_thread_atfork(which)
-{
- struct atfork_list *head;
- struct atfork_entry *ae;
-
- head = &atfork_head[which];
-
- /* Call the fork handlers in order: */
- for (ae = head->tqh_first; ae != NULL; ae = ae->entries.tqe_next)
- (*ae->handler)();
-}
-
-int
-pthread_atfork(prepare, parent, child)
- void (*prepare)(void);
- void (*parent)(void);
- void (*child)(void);
-{
- int ret = 0;
- struct atfork_entry *prepare_entry = NULL;
- struct atfork_entry *parent_entry = NULL;
- struct atfork_entry *child_entry = NULL;
-
- if (ret == 0 && prepare != NULL) {
- /* Allocate space for the prepare handler: */
- if ((prepare_entry = malloc(sizeof *prepare_entry)) != NULL)
- prepare_entry->handler = prepare;
- else
- ret = -1;
- }
-
- if (ret == 0 && parent != NULL) {
- /* Allocate space for the parent handler: */
- if ((parent_entry = malloc(sizeof *parent_entry)) != NULL)
- parent_entry->handler = parent;
- else
- ret = -1;
- }
-
- if (ret == 0 && child != NULL) {
- /* Allocate space for the child handler: */
- if ((child_entry = malloc(sizeof *child_entry)) != NULL)
- child_entry->handler = child;
- else
- ret = -1;
- }
-
- if (ret == 0) {
- /* Insert the handlers into the handler lists: */
- if (prepare_entry != NULL)
- TAILQ_INSERT_HEAD(&atfork_head[PTHREAD_ATFORK_PREPARE],
- prepare_entry, entries);
- if (parent_entry != NULL)
- TAILQ_INSERT_TAIL(&atfork_head[PTHREAD_ATFORK_PARENT],
- parent_entry, entries);
- if (child_entry != NULL)
- TAILQ_INSERT_TAIL(&atfork_head[PTHREAD_ATFORK_CHILD],
- child_entry, entries);
- } else {
- /* Release unused resources: */
- if (prepare_entry)
- free(prepare_entry);
- if (child_entry)
- free(child_entry);
- if (parent_entry)
- free(parent_entry);
- }
-
- return (ret);
-}
-#endif
diff --git a/lib/libc_r/uthread/uthread_fork.c b/lib/libc_r/uthread/uthread_fork.c
index 9dc90825233..ed1566915bd 100644
--- a/lib/libc_r/uthread/uthread_fork.c
+++ b/lib/libc_r/uthread/uthread_fork.c
@@ -29,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $OpenBSD: uthread_fork.c,v 1.5 1999/05/26 00:18:23 d Exp $
+ * $OpenBSD: uthread_fork.c,v 1.6 1999/06/15 00:07:39 d Exp $
*/
#include <errno.h>
#include <string.h>
@@ -48,17 +48,12 @@ fork(void)
pthread_t pthread;
pthread_t pthread_next;
- /* Call atfork handlers: */
- _thread_atfork(PTHREAD_ATFORK_PREPARE);
-
/* Lock the thread list: */
_lock_thread_list();
/* Fork a new process: */
if ((ret = _thread_sys_fork()) != 0) {
/* Parent process or error. Nothing to do here. */
- if (ret > 0)
- _thread_atfork(PTHREAD_ATFORK_PARENT);
} else {
/* Close the pthread kernel pipe: */
_thread_sys_close(_thread_kern_pipe[0]);
@@ -157,9 +152,6 @@ fork(void)
_thread_queue_init(&_thread_fd_table[i]->w_queue);
}
}
-
- /* Initialise the atfork handler: */
- _thread_atfork(PTHREAD_ATFORK_CHILD);
}
}