summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2016-10-09 13:25:00 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2016-10-09 13:25:00 +0200
commit9705f94a6126281c2a909d8bf3c23fad818183fc (patch)
tree5cee778885956dcb43f447a3bc46757f4058bc01
parent1f32bdc2e2f54cf4279b720909ff9c2d64a1c406 (diff)
parent8f3d3f814dd14961ff72bd056244a854ff9c2271 (diff)
Merge branch 'master' into master-glibc-2.23
-rw-r--r--forward.c69
-rw-r--r--sysdeps/generic/fork.h29
-rw-r--r--sysdeps/pthread/Makefile3
3 files changed, 82 insertions, 19 deletions
diff --git a/forward.c b/forward.c
index c3a1f32..c819357 100644
--- a/forward.c
+++ b/forward.c
@@ -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)"'