From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS31976 209.132.180.0/23 X-Spam-Status: No, score=-4.3 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 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 dcvr.yhbt.net (Postfix) with ESMTPS id 5CF8920248 for ; Tue, 16 Apr 2019 17:32:34 +0000 (UTC) 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; q=dns; s=default; b=HVBUyRZjRm9wp11BjIjdeycdT4GtRBm Qi8yVV/SQYgYa2t9wLZCjTCHcczUyQa732hq8czrZTg2cTAnjj8gsm5XMrU525Dl kw6Od1pm+gqd28PeTQI2kwbr+wxSU+LeFDUpJRw+ANytoSTtxBgd+DDC73kRucv1 IoCSjt9MoA6I= 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; s=default; bh=FnuVlJySNWW1Z4X/JdhWDeEr9cs=; b=VQdSJ 3GqVxAFZQ1raMyw/Vy63cMbaypIONg5hQLtT79MqVj8quWMXwyQ+4zdS+wDm/Mmq ZxACmyJbj63GTU2MzX3nk33B8agbcDIo+fILaW7ac0IMyKkXCA5v648yjdgl52d9 lHA8QSy2u3jEhawsHW7QTwocTkU/FSIVFeQntA= Received: (qmail 107377 invoked by alias); 16 Apr 2019 17:32:24 -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 Received: (qmail 107284 invoked by uid 89); 16 Apr 2019 17:32:23 -0000 Authentication-Results: sourceware.org; auth=none X-HELO: mail.efficios.com DKIM-Filter: OpenDKIM Filter v2.10.3 mail.efficios.com 185A81D3C6A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=efficios.com; s=default; t=1555435940; bh=xN2+HrwISIUWpWoEeOu8d6SgRpGm8NSTF8sC6P7oZbk=; h=From:To:Date:Message-Id; b=SLKETk4zAvpcS0ZIu/lsnSxcctScR89iALtxa0EYJsqXpj+lpxlAxTPK4LnLJ3ib8 1zEC3tQeuW1OPnPZRoYa1VdVHZuUTj9Jhs613aoGY4xvr58IH4iq7FdvXOKJJBStgF aYFopmuTNbPnxUVXhSXKEM2SDTob7lfypHaOWfXUltOeU0imeWflF1MzVVwL3Sht6/ 9f8+W7CHW1Lc4TZwTuXkLNJge1WndSA4CN+K/YgfjfD76Hjaks0c3mApwjzEN+OPlC EuQBrsRnXHMrJC0Pe42v9NVB4iYuSO2L8aFJY9jURT8cRPNM/iwVqdtbjnRCSvBjAP q0pSfCaYGQolA== From: Mathieu Desnoyers To: Carlos O'Donell Cc: Florian Weimer , Joseph Myers , Szabolcs Nagy , libc-alpha@sourceware.org, Mathieu Desnoyers Subject: [PATCH 3/5] support record failure: allow use from constructor Date: Tue, 16 Apr 2019 13:32:14 -0400 Message-Id: <20190416173216.9028-4-mathieu.desnoyers@efficios.com> In-Reply-To: <20190416173216.9028-1-mathieu.desnoyers@efficios.com> References: <20190416173216.9028-1-mathieu.desnoyers@efficios.com> Expose support_record_failure_init () so constructors can explicitly initialize the record failure API. This is preferred to lazy initialization at first use, because lazy initialization does not cover use in constructors within forked children processes (forked from parent constructor). Signed-off-by: Mathieu Desnoyers Reviewed-by: Carlos O'Donell CC: Carlos O'Donell CC: Florian Weimer CC: Joseph Myers CC: Szabolcs Nagy CC: libc-alpha@sourceware.org --- support/check.h | 4 ++++ support/support_record_failure.c | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/support/check.h b/support/check.h index eb3d2487a7..f8684a477a 100644 --- a/support/check.h +++ b/support/check.h @@ -88,6 +88,10 @@ void support_test_verify_exit_impl (int status, const char *file, int line, does not support reporting failures from a DSO. */ void support_record_failure (void); +/* Initialize record failure. Calling this is only needed when + recording failures from constructors. */ +void support_record_failure_init (void); + /* Static assertion, under a common name for both C++ and C11. */ #ifdef __cplusplus # define support_static_assert static_assert diff --git a/support/support_record_failure.c b/support/support_record_failure.c index a8ffd1fb7d..86d9c71409 100644 --- a/support/support_record_failure.c +++ b/support/support_record_failure.c @@ -32,8 +32,12 @@ zero, the failure of a test can be detected. The init constructor function below puts *state on a shared - annonymous mapping, so that failure reports from subprocesses - propagate to the parent process. */ + anonymous mapping, so that failure reports from subprocesses + propagate to the parent process. + + support_record_failure_init is exposed so it can be called explicitly + in case this API needs to be used from a constructor. */ + struct test_failures { unsigned int counter; @@ -41,10 +45,14 @@ struct test_failures }; static struct test_failures *state; -static __attribute__ ((constructor)) void -init (void) +__attribute__ ((constructor)) void +support_record_failure_init (void) { - void *ptr = mmap (NULL, sizeof (*state), PROT_READ | PROT_WRITE, + void *ptr; + + if (state != NULL) + return; + ptr = mmap (NULL, sizeof (*state), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0); if (ptr == MAP_FAILED) { -- 2.17.1