diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-10-09 13:25:00 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-10-09 13:25:00 +0200 |
commit | 9705f94a6126281c2a909d8bf3c23fad818183fc (patch) | |
tree | 5cee778885956dcb43f447a3bc46757f4058bc01 | |
parent | 1f32bdc2e2f54cf4279b720909ff9c2d64a1c406 (diff) | |
parent | 8f3d3f814dd14961ff72bd056244a854ff9c2271 (diff) |
Merge branch 'master' into master-glibc-2.23
-rw-r--r-- | forward.c | 69 | ||||
-rw-r--r-- | sysdeps/generic/fork.h | 29 | ||||
-rw-r--r-- | sysdeps/pthread/Makefile | 3 |
3 files changed, 82 insertions, 19 deletions
@@ -22,6 +22,7 @@ #include <stdlib.h> #include <shlib-compat.h> #include <pthread-functions.h> +#include <fork.h> /* Pointers to the libc functions. */ struct pthread_functions __libc_pthread_functions attribute_hidden; @@ -171,13 +172,13 @@ atfork_pthread_prepare (void) return; while(1) - { - if (last_handler->prepare != NULL) - last_handler->prepare (); - if (last_handler == handlers) - break; - last_handler = last_handler->prev; - } + { + if (last_handler->prepare != NULL) + last_handler->prepare (); + if (last_handler == handlers) + break; + last_handler = last_handler->prev; + } } text_set_element (_hurd_atfork_prepare_hook, atfork_pthread_prepare); @@ -191,11 +192,11 @@ atfork_pthread_parent (void) __mutex_unlock (&atfork_lock); while (handlers) - { - if (handlers->parent != NULL) - handlers->parent (); - handlers = handlers->next; - } + { + if (handlers->parent != NULL) + handlers->parent (); + handlers = handlers->next; + } } text_set_element (_hurd_atfork_parent_hook, atfork_pthread_parent); @@ -209,11 +210,11 @@ atfork_pthread_child (void) __mutex_unlock (&atfork_lock); while (handlers) - { - if (handlers->child != NULL) - handlers->child (); - handlers = handlers->next; - } + { + if (handlers->child != NULL) + handlers->child (); + handlers = handlers->next; + } } text_set_element (_hurd_atfork_child_hook, atfork_pthread_child); @@ -237,7 +238,7 @@ __register_atfork ( __mutex_lock (&atfork_lock); new->next = fork_handlers; if (fork_handlers) - fork_handlers->prev = new; + fork_handlers->prev = new; fork_handlers = new; if (!fork_last_handler) fork_last_handler = new; @@ -246,4 +247,34 @@ __register_atfork ( return 0; } -/* TODO: unregister_atfork, and define UNREGISTER_ATFORK, for module unload support */ +void +__unregister_atfork (void *dso_handle) +{ + struct atfork **handlers, *prev = NULL, *next; + __mutex_lock (&atfork_lock); + handlers = &fork_handlers; + while (*handlers) + { + if ((*handlers)->dso_handle == dso_handle) + { + /* Drop this handler from the list. */ + if (*handlers == fork_last_handler) + { + /* Was last, new last is prev, if any. */ + fork_last_handler = prev; + } + + next = (*handlers)->next; + if (next) + next->prev = prev; + *handlers = next; + } + else + { + /* Just proceed to next handler. */ + prev = *handlers; + handlers = &prev->next; + } + } + __mutex_unlock (&atfork_lock); +} diff --git a/sysdeps/generic/fork.h b/sysdeps/generic/fork.h new file mode 100644 index 0000000..c6ac15e --- /dev/null +++ b/sysdeps/generic/fork.h @@ -0,0 +1,29 @@ +/* Copyright (C) 2002-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* Function to call to unregister fork handlers. */ +extern void __unregister_atfork (void *dso_handle) attribute_hidden; +#define UNREGISTER_ATFORK(dso_handle) __unregister_atfork (dso_handle) + + +/* C library side function to register new fork handlers. */ +extern int __register_atfork (void (*__prepare) (void), + void (*__parent) (void), + void (*__child) (void), + void *dso_handle); +libc_hidden_proto (__register_atfork) diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile index 0596130..f5dbd25 100644 --- a/sysdeps/pthread/Makefile +++ b/sysdeps/pthread/Makefile @@ -1,3 +1,6 @@ +ifeq ($(subdir),rt) +librt-sysdep_routines += timer_routines +endif ifeq ($(subdir),posix) # FIXME: this is not getting $(pthread-version) from libpthread/Makefile! CFLAGS-confstr.c += -DLIBPTHREAD_VERSION='"libpthread $(pthread-version)"' |