summaryrefslogtreecommitdiffstats
path: root/libc/bionic/pthread-atfork.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/bionic/pthread-atfork.c')
-rw-r--r--libc/bionic/pthread-atfork.c126
1 files changed, 0 insertions, 126 deletions
diff --git a/libc/bionic/pthread-atfork.c b/libc/bionic/pthread-atfork.c
deleted file mode 100644
index 42420dc..0000000
--- a/libc/bionic/pthread-atfork.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-#include <stdlib.h>
-#include <errno.h>
-#include <pthread.h>
-#include <sys/queue.h>
-
-static pthread_mutex_t handler_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER;
-
-struct atfork_t
-{
- CIRCLEQ_ENTRY(atfork_t) entries;
-
- void (*prepare)(void);
- void (*child)(void);
- void (*parent)(void);
-};
-static CIRCLEQ_HEAD(atfork_head_t, atfork_t) atfork_head = \
- CIRCLEQ_HEAD_INITIALIZER(atfork_head);
-
-void __bionic_atfork_run_prepare()
-{
- struct atfork_t *cursor;
-
- /* We will lock this here, and unlock it in the parent and child functions.
- * This ensures that nobody can modify the handler array between the calls
- * to the prepare and parent/child handlers.
- *
- * TODO: If a handler mucks with the list, it could cause problems. Right
- * now it's ok because all they can do is add new items to the end
- * of the list, but if/when we implement cleanup in dlclose() things
- * will get more interesting...
- */
- pthread_mutex_lock(&handler_mutex);
-
- /* Call pthread_atfork() prepare handlers. Posix states that the prepare
- * handlers should be called in the reverse order of the parent/child
- * handlers, so we iterate backwards.
- */
- for (cursor = atfork_head.cqh_last;
- cursor != (void*)&atfork_head;
- cursor = cursor->entries.cqe_prev) {
- if (cursor->prepare != NULL) {
- cursor->prepare();
- }
- }
-}
-
-void __bionic_atfork_run_child()
-{
- struct atfork_t *cursor;
- pthread_mutexattr_t attr;
-
- /* Call pthread_atfork() child handlers */
- for (cursor = atfork_head.cqh_first;
- cursor != (void*)&atfork_head;
- cursor = cursor->entries.cqe_next) {
- if (cursor->child != NULL) {
- cursor->child();
- }
- }
-
- pthread_mutexattr_init(&attr);
- pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
- pthread_mutex_init(&handler_mutex, &attr);
-}
-
-void __bionic_atfork_run_parent()
-{
- struct atfork_t *cursor;
-
- /* Call pthread_atfork() parent handlers */
- for (cursor = atfork_head.cqh_first;
- cursor != (void*)&atfork_head;
- cursor = cursor->entries.cqe_next) {
- if (cursor->parent != NULL) {
- cursor->parent();
- }
- }
-
- pthread_mutex_unlock(&handler_mutex);
-}
-
-int pthread_atfork(void (*prepare)(void), void (*parent)(void), void(*child)(void))
-{
- struct atfork_t *entry = malloc(sizeof(struct atfork_t));
-
- if (entry == NULL) {
- return ENOMEM;
- }
-
- entry->prepare = prepare;
- entry->parent = parent;
- entry->child = child;
-
- pthread_mutex_lock(&handler_mutex);
- CIRCLEQ_INSERT_TAIL(&atfork_head, entry, entries);
- pthread_mutex_unlock(&handler_mutex);
-
- return 0;
-}