From patchwork Wed Jan 8 14:58:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Desnoyers X-Patchwork-Id: 1219733 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-108531-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=efficios.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="Ahx0CNat"; dkim=pass (2048-bit key; unprotected) header.d=efficios.com header.i=@efficios.com header.b="bEpLbBT+"; 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 47tC8w20trz9sP6 for ; Thu, 9 Jan 2020 02:00:16 +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; q=dns; s=default; b=Ujjnq+DrMuqaDNepiKbg22cx5BTBA6a Oh1X9gI8Qt9L/DOfA6I+Wj9xHlWAJwqqFBH7+ZU8hELhHrFn6pjr/8WSRTRAUBDR iAH3qC6ohvgwXits2OareZCteZb6GRZiNyClD3dFVj/iDoftR7bOcAzcmwXIzjuZ nlxyg5TPrn5g= 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=27rF9Era7KzpBE9zmBWS6gYPVSE=; b=Ahx0C NatAodkpvV8b4bclc0P+1ORoTaafNxp3O0iPjfBKk7ZG2LFwgGpqIGF7GbZeO1VY 8S2Ps+U7YdQZYZ495i772on/phZrMbsWDUb/YwFtMrste8C485lj1Er6x4F9P8Gp mYq4Pe6gze2z7gaSFcLpz8rg/oxwgEM2V6jqpU= Received: (qmail 14295 invoked by alias); 8 Jan 2020 14:59:30 -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 14166 invoked by uid 89); 8 Jan 2020 14:59:29 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=4514 X-HELO: mail.efficios.com DKIM-Filter: OpenDKIM Filter v2.10.3 mail.efficios.com EB4196959D5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=efficios.com; s=default; t=1578495563; bh=WyiI6XGPnNirHva+oYxDT/UpZt9Gu97peQ6rBL7JAxk=; h=From:To:Date:Message-Id; b=bEpLbBT+4IcE+GRcd8PQXILiuRTn3xcRvOi346CWvPywGpAeWo//8+ZiLCoFeH+FC RomZxMaIOB891km53TJQXZqPEQUp6ZvRmM7JpmVkHoJSuj8K/VIWiwgfx7koMNVYbE 9eHImXTkIiK40JNAOzq1lJlV/2bJz3xbm3bIUcv/csRIn98ssHMFcd1YjtV+qmDUxN Afgc1waupEXqLc92QbJkt/B7lXTFvZQtF9Egygk1pnkNP20IUQeTgy553cEUkk3xHq lIqZWkbzdj7xve5NcrZv9nxSz3YRs+wMh6FMpKFS6NVrrQFMOvbvzYsNUIbsMZyzc+ oGT8nJXzd25Dw== From: Mathieu Desnoyers To: Carlos O'Donell Cc: Florian Weimer , Joseph Myers , Szabolcs Nagy , libc-alpha@sourceware.org, Mathieu Desnoyers Subject: [RFC PATCH glibc 6/8] support record failure: allow use from constructor Date: Wed, 8 Jan 2020 09:58:49 -0500 Message-Id: <20200108145851.13594-7-mathieu.desnoyers@efficios.com> In-Reply-To: <20200108145851.13594-1-mathieu.desnoyers@efficios.com> References: <20200108145851.13594-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 77d1d1e14d..902cea6878 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 f766c06236..957572f487 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) {