From 8f3d3f814dd14961ff72bd056244a854ff9c2271 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Sun, 9 Oct 2016 13:24:07 +0200 Subject: Add unregistering atfork handlers on dlclose * sysdeps/generic/fork.h: New file. * forward.c: Include . (__unregister_atfork): New function. --- forward.c | 33 ++++++++++++++++++++++++++++++++- sysdeps/generic/fork.h | 29 +++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 sysdeps/generic/fork.h diff --git a/forward.c b/forward.c index 79b2bec..af1d2c4 100644 --- a/forward.c +++ b/forward.c @@ -22,6 +22,7 @@ #include #include #include +#include /* 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 , 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 + . */ + +/* 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) -- cgit v1.2.3