diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2020-02-10 21:02:03 +0000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2020-02-10 21:02:03 +0000 |
commit | 21a8c5ee6ef605bf53aba25cd8f57b7269e728b7 (patch) | |
tree | 3f9ca9302352f3feeb222a5b3b22044485651ff7 | |
parent | 976e7c3dbd3355c1d2eaec396c19f1fdf0095eb3 (diff) | |
parent | f7efceb042cfa3af027d7a96bbd86a3b217047bf (diff) |
Merge branch 'glibc-2.31' of salsa.debian.org:glibc-team/glibc into glibc-2.31
-rw-r--r-- | debian/changelog | 5 | ||||
-rw-r--r-- | debian/patches/hurd-i386/git-register-atfork.diff | 330 | ||||
-rw-r--r-- | debian/patches/series | 1 |
3 files changed, 336 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog index ccbd7d48..75e2725f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -51,6 +51,7 @@ glibc (2.31-0experimental0) UNRELEASED; urgency=medium * debian/testsuite-xfail-debian.mk: Update hurd-i386 results. * debian/debhelper.in/libc-dev.install.hurd-i386: Do not install libpthread_nonshared, removed upstream. + * debian/patches/hurd-i386/local-atfork-link.diff: Remove, now useless. * debian/patches/hurd-i386/tg-hurdsig-SA_SIGINFO.diff: Fix build. -- Aurelien Jarno <aurel32@debian.org> Sat, 08 Feb 2020 13:52:09 +0100 @@ -67,6 +68,10 @@ glibc (2.30-0experimental3) UNRELEASED; urgency=medium pthread_barrier_wait with one thread. * debian/patches/hurd-i386/git-sem-intr.diff: New patch to make sem_wait/timedwait interruptible. + * debian/patches/hurd-i386/local-atfork-link.diff: New patch to fix + libpthread link. + * debian/patches/hurd-i386/git-register-atfork.diff: Fix linking with static + libpthread. [ Aurelien Jarno ] * debian/patches/any/local-revert-24323.diff: drop, obsolete. diff --git a/debian/patches/hurd-i386/git-register-atfork.diff b/debian/patches/hurd-i386/git-register-atfork.diff new file mode 100644 index 00000000..5758aaea --- /dev/null +++ b/debian/patches/hurd-i386/git-register-atfork.diff @@ -0,0 +1,330 @@ +commit 6db1094f7af6ddd7ff37dbba82ff5074871a90d5 +Author: Samuel Thibault <samuel.thibault@ens-lyon.org> +Date: Sun Feb 9 17:55:37 2020 +0000 + + htl: Move __register_atfork from forward to own file + + Since we need it also in the static linking case. + +diff --git a/htl/Makefile b/htl/Makefile +index 0dccf25ebc..71b14d5e96 100644 +--- a/htl/Makefile ++++ b/htl/Makefile +@@ -163,7 +163,7 @@ headers := \ + + distribute := + +-routines := forward libc_pthread_init alloca_cutoff pt-atfork ++routines := forward libc_pthread_init alloca_cutoff register-atfork pt-atfork + shared-only-routines = forward + static-only-routines = pt-atfork + +diff --git a/htl/forward.c b/htl/forward.c +index b0cc5f574b..dfb7b79327 100644 +--- a/htl/forward.c ++++ b/htl/forward.c +@@ -143,141 +143,3 @@ FORWARD (pthread_setcanceltype, (int type, int *oldtype), (type, oldtype), 0) + struct __pthread_cancelation_handler *dummy_list; + FORWARD2 (__pthread_get_cleanup_stack, struct __pthread_cancelation_handler **, + (void), (), return &dummy_list); +- +- +-/* Fork interaction */ +- +-struct atfork +-{ +- void (*prepare) (void); +- void (*parent) (void); +- void (*child) (void); +- void *dso_handle; +- struct atfork *prev; +- struct atfork *next; +-}; +- +-/* TODO: better locking */ +-__libc_lock_define_initialized (static, atfork_lock); +-static struct atfork *fork_handlers, *fork_last_handler; +- +-static void +-atfork_pthread_prepare (void) +-{ +- struct atfork *handlers, *last_handler; +- +- __libc_lock_lock (atfork_lock); +- handlers = fork_handlers; +- last_handler = fork_last_handler; +- __libc_lock_unlock (atfork_lock); +- +- if (last_handler == NULL) +- return; +- +- while (1) +- { +- 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); +- +-static void +-atfork_pthread_parent (void) +-{ +- struct atfork *handlers; +- +- __libc_lock_lock (atfork_lock); +- handlers = fork_handlers; +- __libc_lock_unlock (atfork_lock); +- +- while (handlers != NULL) +- { +- if (handlers->parent != NULL) +- handlers->parent (); +- handlers = handlers->next; +- } +-} +-text_set_element (_hurd_atfork_parent_hook, atfork_pthread_parent); +- +-static void +-atfork_pthread_child (void) +-{ +- struct atfork *handlers; +- +- __libc_lock_lock (atfork_lock); +- handlers = fork_handlers; +- __libc_lock_unlock (atfork_lock); +- +- while (handlers != NULL) +- { +- if (handlers->child != NULL) +- handlers->child (); +- handlers = handlers->next; +- } +-} +-text_set_element (_hurd_atfork_child_hook, atfork_pthread_child); +- +-int +-__register_atfork (void (*prepare) (void), +- void (*parent) (void), +- void (*child) (void), +- void *dso_handle) +-{ +- struct atfork *new = malloc (sizeof (*new)); +- if (new == NULL) +- return errno; +- +- new->prepare = prepare; +- new->parent = parent; +- new->child = child; +- new->dso_handle = dso_handle; +- new->prev = NULL; +- +- __libc_lock_lock (atfork_lock); +- new->next = fork_handlers; +- if (fork_handlers != NULL) +- fork_handlers->prev = new; +- fork_handlers = new; +- if (fork_last_handler == NULL) +- fork_last_handler = new; +- __libc_lock_unlock (atfork_lock); +- +- return 0; +-} +-libc_hidden_def (__register_atfork) +- +-void +-__unregister_atfork (void *dso_handle) +-{ +- struct atfork **handlers, *prev = NULL, *next; +- __libc_lock_lock (atfork_lock); +- handlers = &fork_handlers; +- while (*handlers != NULL) +- { +- 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 != NULL) +- next->prev = prev; +- *handlers = next; +- } +- else +- { +- /* Just proceed to next handler. */ +- prev = *handlers; +- handlers = &prev->next; +- } +- } +- __libc_lock_unlock (atfork_lock); +-} +diff --git a/htl/register-atfork.c b/htl/register-atfork.c +new file mode 100644 +index 0000000000..256b1148ac +--- /dev/null ++++ b/htl/register-atfork.c +@@ -0,0 +1,157 @@ ++/* Atfork handling. Hurd pthread version. ++ Copyright (C) 2002-2020 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ 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 ++ <https://www.gnu.org/licenses/>. */ ++ ++#include <errno.h> ++#include <stdlib.h> ++#include <libc-lock.h> ++#include <fork.h> ++ ++struct atfork ++{ ++ void (*prepare) (void); ++ void (*parent) (void); ++ void (*child) (void); ++ void *dso_handle; ++ struct atfork *prev; ++ struct atfork *next; ++}; ++ ++/* TODO: better locking */ ++__libc_lock_define_initialized (static, atfork_lock); ++static struct atfork *fork_handlers, *fork_last_handler; ++ ++static void ++atfork_pthread_prepare (void) ++{ ++ struct atfork *handlers, *last_handler; ++ ++ __libc_lock_lock (atfork_lock); ++ handlers = fork_handlers; ++ last_handler = fork_last_handler; ++ __libc_lock_unlock (atfork_lock); ++ ++ if (last_handler == NULL) ++ return; ++ ++ while (1) ++ { ++ 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); ++ ++static void ++atfork_pthread_parent (void) ++{ ++ struct atfork *handlers; ++ ++ __libc_lock_lock (atfork_lock); ++ handlers = fork_handlers; ++ __libc_lock_unlock (atfork_lock); ++ ++ while (handlers != NULL) ++ { ++ if (handlers->parent != NULL) ++ handlers->parent (); ++ handlers = handlers->next; ++ } ++} ++text_set_element (_hurd_atfork_parent_hook, atfork_pthread_parent); ++ ++static void ++atfork_pthread_child (void) ++{ ++ struct atfork *handlers; ++ ++ __libc_lock_lock (atfork_lock); ++ handlers = fork_handlers; ++ __libc_lock_unlock (atfork_lock); ++ ++ while (handlers != NULL) ++ { ++ if (handlers->child != NULL) ++ handlers->child (); ++ handlers = handlers->next; ++ } ++} ++text_set_element (_hurd_atfork_child_hook, atfork_pthread_child); ++ ++int ++__register_atfork (void (*prepare) (void), ++ void (*parent) (void), ++ void (*child) (void), ++ void *dso_handle) ++{ ++ struct atfork *new = malloc (sizeof (*new)); ++ if (new == NULL) ++ return errno; ++ ++ new->prepare = prepare; ++ new->parent = parent; ++ new->child = child; ++ new->dso_handle = dso_handle; ++ new->prev = NULL; ++ ++ __libc_lock_lock (atfork_lock); ++ new->next = fork_handlers; ++ if (fork_handlers != NULL) ++ fork_handlers->prev = new; ++ fork_handlers = new; ++ if (fork_last_handler == NULL) ++ fork_last_handler = new; ++ __libc_lock_unlock (atfork_lock); ++ ++ return 0; ++} ++libc_hidden_def (__register_atfork) ++ ++void ++__unregister_atfork (void *dso_handle) ++{ ++ struct atfork **handlers, *prev = NULL, *next; ++ __libc_lock_lock (atfork_lock); ++ handlers = &fork_handlers; ++ while (*handlers != NULL) ++ { ++ 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 != NULL) ++ next->prev = prev; ++ *handlers = next; ++ } ++ else ++ { ++ /* Just proceed to next handler. */ ++ prev = *handlers; ++ handlers = &prev->next; ++ } ++ } ++ __libc_lock_unlock (atfork_lock); ++} diff --git a/debian/patches/series b/debian/patches/series index 18ad354f..ee83106c 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -62,6 +62,7 @@ hurd-i386/git-fork-pthread_exit.diff hurd-i386/git-spin_lock.diff hurd-i386/git-barrier-1.diff hurd-i386/git-sem-intr.diff +hurd-i386/git-register-atfork.diff i386/local-biarch.diff i386/unsubmitted-quiet-ldconfig.diff |