summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libc/include/atfork.h44
-rw-r--r--src/lib/libc/include/thread_private.h19
-rw-r--r--src/lib/libc/stdlib/atexit.c20
3 files changed, 81 insertions, 2 deletions
diff --git a/src/lib/libc/include/atfork.h b/src/lib/libc/include/atfork.h
new file mode 100644
index 0000000000..8ec611098c
--- /dev/null
+++ b/src/lib/libc/include/atfork.h
@@ -0,0 +1,44 @@
1/* $OpenBSD: atfork.h,v 1.1 2015/04/07 01:27:07 guenther Exp $ */
2
3/*
4 * Copyright (c) 2008 Kurt Miller <kurt@openbsd.org>
5 * Copyright (c) 2008 Philip Guenther <guenther@openbsd.org>
6 * Copyright (c) 2003 Daniel Eischen <deischen@freebsd.org>
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Neither the name of the author nor the names of any co-contributors
15 * may be used to endorse or promote products derived from this software
16 * without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 *
30 * $FreeBSD: /repoman/r/ncvs/src/lib/libc_r/uthread/uthread_atfork.c,v 1.1 2004/12/10 03:36:45 grog Exp $
31 */
32
33#include <sys/queue.h>
34
35struct atfork_fn {
36 TAILQ_ENTRY(atfork_fn) fn_next;
37 void (*fn_prepare)(void);
38 void (*fn_parent)(void);
39 void (*fn_child)(void);
40 void *fn_dso;
41};
42
43extern TAILQ_HEAD(atfork_listhead, atfork_fn) _atfork_list;
44
diff --git a/src/lib/libc/include/thread_private.h b/src/lib/libc/include/thread_private.h
index 673fb9c6a6..43ebf7d96e 100644
--- a/src/lib/libc/include/thread_private.h
+++ b/src/lib/libc/include/thread_private.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: thread_private.h,v 1.25 2011/10/16 06:29:56 guenther Exp $ */ 1/* $OpenBSD: thread_private.h,v 1.26 2015/04/07 01:27:07 guenther Exp $ */
2 2
3/* PUBLIC DOMAIN: No Rights Reserved. Marco S Hyman <marc@snafu.org> */ 3/* PUBLIC DOMAIN: No Rights Reserved. Marco S Hyman <marc@snafu.org> */
4 4
@@ -160,6 +160,18 @@ void _thread_atexit_unlock(void);
160 _thread_atexit_unlock();\ 160 _thread_atexit_unlock();\
161 } while (0) 161 } while (0)
162 162
163void _thread_atfork_lock(void);
164void _thread_atfork_unlock(void);
165
166#define _ATFORK_LOCK() do { \
167 if (__isthreaded) \
168 _thread_atfork_lock(); \
169 } while (0)
170#define _ATFORK_UNLOCK() do { \
171 if (__isthreaded) \
172 _thread_atfork_unlock();\
173 } while (0)
174
163void _thread_arc4_lock(void); 175void _thread_arc4_lock(void);
164void _thread_arc4_unlock(void); 176void _thread_arc4_unlock(void);
165 177
@@ -172,4 +184,9 @@ void _thread_arc4_unlock(void);
172 _thread_arc4_unlock();\ 184 _thread_arc4_unlock();\
173 } while (0) 185 } while (0)
174 186
187/*
188 * Wrapper for _thread_sys_fork()
189 */
190pid_t _thread_fork(void);
191
175#endif /* _THREAD_PRIVATE_H_ */ 192#endif /* _THREAD_PRIVATE_H_ */
diff --git a/src/lib/libc/stdlib/atexit.c b/src/lib/libc/stdlib/atexit.c
index 6532b382ea..a33080571f 100644
--- a/src/lib/libc/stdlib/atexit.c
+++ b/src/lib/libc/stdlib/atexit.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: atexit.c,v 1.20 2014/07/11 09:51:37 kettenis Exp $ */ 1/* $OpenBSD: atexit.c,v 1.21 2015/04/07 01:27:07 guenther Exp $ */
2/* 2/*
3 * Copyright (c) 2002 Daniel Hartmeier 3 * Copyright (c) 2002 Daniel Hartmeier
4 * All rights reserved. 4 * All rights reserved.
@@ -35,6 +35,7 @@
35#include <string.h> 35#include <string.h>
36#include <unistd.h> 36#include <unistd.h>
37#include "atexit.h" 37#include "atexit.h"
38#include "atfork.h"
38#include "thread_private.h" 39#include "thread_private.h"
39 40
40struct atexit *__atexit; 41struct atexit *__atexit;
@@ -161,6 +162,23 @@ restart:
161 __atexit = NULL; 162 __atexit = NULL;
162 } 163 }
163 _ATEXIT_UNLOCK(); 164 _ATEXIT_UNLOCK();
165
166 /*
167 * If unloading a DSO, unregister any atfork handlers registered
168 * by it. Skip the locking if the list is currently empty.
169 */
170 if (dso != NULL && TAILQ_FIRST(&_atfork_list) != NULL) {
171 struct atfork_fn *af, *afnext;
172
173 _ATFORK_LOCK();
174 TAILQ_FOREACH_SAFE(af, &_atfork_list, fn_next, afnext)
175 if (af->fn_dso == dso) {
176 TAILQ_REMOVE(&_atfork_list, af, fn_next);
177 free(af);
178 }
179 _ATFORK_UNLOCK();
180
181 }
164} 182}
165 183
166/* 184/*