summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2020-02-10 21:02:03 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2020-02-10 21:02:03 +0000
commit21a8c5ee6ef605bf53aba25cd8f57b7269e728b7 (patch)
tree3f9ca9302352f3feeb222a5b3b22044485651ff7
parent976e7c3dbd3355c1d2eaec396c19f1fdf0095eb3 (diff)
parentf7efceb042cfa3af027d7a96bbd86a3b217047bf (diff)
Merge branch 'glibc-2.31' of salsa.debian.org:glibc-team/glibc into glibc-2.31
-rw-r--r--debian/changelog5
-rw-r--r--debian/patches/hurd-i386/git-register-atfork.diff330
-rw-r--r--debian/patches/series1
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