diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-10-09 13:24:07 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-10-09 13:24:07 +0200 |
commit | 8f3d3f814dd14961ff72bd056244a854ff9c2271 (patch) | |
tree | e4f93899ab12509e1b366667e6a287156af3ac79 | |
parent | fb9ace04f816406b1537d487d71d0b8e897aab4c (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.c | 33 | ||||
-rw-r--r-- | sysdeps/generic/fork.h | 29 |
2 files changed, 61 insertions, 1 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; @@ -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) |