summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2016-10-09 13:24:07 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2016-10-09 13:24:07 +0200
commit8f3d3f814dd14961ff72bd056244a854ff9c2271 (patch)
treee4f93899ab12509e1b366667e6a287156af3ac79
parentfb9ace04f816406b1537d487d71d0b8e897aab4c (diff)
Add unregistering atfork handlers on dlclose
* sysdeps/generic/fork.h: New file. * forward.c: Include <fork.h>. (__unregister_atfork): New function.
-rw-r--r--forward.c33
-rw-r--r--sysdeps/generic/fork.h29
2 files changed, 61 insertions, 1 deletions
diff --git a/forward.c b/forward.c
index 79b2bec..af1d2c4 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;
@@ -245,4 +246,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)