From patchwork Sun Feb 9 18:01:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Samuel Thibault X-Patchwork-Id: 1235501 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-109299-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ens-lyon.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha1 header.s=default header.b=j77a7UiM; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48Fxgw46fmz9sPF for ; Mon, 10 Feb 2020 05:02:04 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; q=dns; s=default; b=rxj MGLXf/Dn2dDULD6M8y+bSXDZG3Rffxx0VGHuelo0DTNPHOjLZWURb55TQ89pMo1Z Qn33kiPlLfurdZSKOC0uij41hLy6e06sqcZq56sK1pCLgGAWI9XW9s/HJEMDmP9y LodjeYYmfg95bmHLBGxa56NyEURLSGyirwCCYGbE= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; s=default; bh=TJWhpj2mr gz1A4TPNzJVJXEb7H8=; b=j77a7UiMC7GOOk1fIGds9q1qm0crEawu8XWVYZNIi 3YtvL+3Be7nhoHX9VGZK4yAdjaaHNdzMfG9H4j8QFz6p58qREhHpRaD9iV6h4E4O oOq3uretduPK9N449dC0VqWuYzx3dVgZbEUR31jAMivsPC4KM4TX0ZgZUNROH6NS TI= Received: (qmail 114833 invoked by alias); 9 Feb 2020 18:01:51 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 114732 invoked by uid 89); 9 Feb 2020 18:01:50 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_NEUTRAL autolearn=ham version=3.3.1 spammy=interaction X-HELO: hera.aquilenet.fr From: Samuel Thibault To: libc-alpha@sourceware.org Cc: Samuel Thibault , commit-hurd@gnu.org Subject: [hurd, commited 1/2] htl: Move __register_atfork from forward to own file Date: Sun, 9 Feb 2020 19:01:40 +0100 Message-Id: <20200209180141.289076-1-samuel.thibault@ens-lyon.org> MIME-Version: 1.0 Since we need it also in the static linking case. --- htl/Makefile | 2 +- htl/forward.c | 138 ------------------------------------- htl/register-atfork.c | 157 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 139 deletions(-) create mode 100644 htl/register-atfork.c 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 + . */ + +#include +#include +#include +#include + +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); +} From patchwork Sun Feb 9 18:01:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Samuel Thibault X-Patchwork-Id: 1235500 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-109298-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ens-lyon.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha1 header.s=default header.b=GX7ovn/v; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48Fxgm2tQfz9sPF for ; Mon, 10 Feb 2020 05:01:56 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; q=dns; s= default; b=BJyQ+Q6crB7i0giKK3xyaulxm0lafXIz41ux5yHKPMUXZ2qqDiM9W xlhsUmg/jU3QnjTnktcc1kI0CyZNgoZCNLKZMxnWievaoDY2qQ33fDZlH+bSl2NO wJ3+oYZJf8R2/UYU8fx0XRXg0+Fe01c3p74bwE1VOtoBvxePy5tYeo= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; s=default; bh=JmeXPfSJVgRSkvtJovz6TMhhhjg=; b=GX7ovn/vrtr86Hymuxh5iRCldLap mAHM0t9REBWCx9MPD/Qex2PzUAaqGyInsGQ+eMKlgBozv58XVwVGGnLGOFBzlClV uGd/b7qeoP0OTTe3jzyjcfeLWplxwDbh+dW+WstAXpDFjr/TSpvC2fN3PQnhZQjQ dgmcK7gJeae8Ncw= Received: (qmail 114518 invoked by alias); 9 Feb 2020 18:01:49 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 114444 invoked by uid 89); 9 Feb 2020 18:01:48 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_NEUTRAL autolearn=ham version=3.3.1 spammy=HContent-Transfer-Encoding:8bit X-HELO: hera.aquilenet.fr From: Samuel Thibault To: libc-alpha@sourceware.org Cc: Samuel Thibault , commit-hurd@gnu.org Subject: [hurd,commited 2/2] htl: Fix linking static testcases Date: Sun, 9 Feb 2020 19:01:41 +0100 Message-Id: <20200209180141.289076-2-samuel.thibault@ens-lyon.org> In-Reply-To: <20200209180141.289076-1-samuel.thibault@ens-lyon.org> References: <20200209180141.289076-1-samuel.thibault@ens-lyon.org> MIME-Version: 1.0 They need libpthread.a --- htl/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htl/Makefile b/htl/Makefile index 71b14d5e96..bb9ef5deba 100644 --- a/htl/Makefile +++ b/htl/Makefile @@ -207,3 +207,5 @@ $(addprefix $(objpfx), \ $(tests-nolibpthread), \ $(tests) $(xtests) $(test-srcs))): $(objpfx)libpthread.so endif + +$(addprefix $(objpfx),$(tests-static) $(xtests-static)): $(objpfx)libpthread.a