From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id CHGQN8qLyGDEZAAAWB0awg (envelope-from ) for ; Tue, 15 Jun 2021 07:15:22 -0400 Received: by simark.ca (Postfix, from userid 112) id E16E91F163; Tue, 15 Jun 2021 07:15:22 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=MAILING_LIST_MULTI, RDNS_DYNAMIC,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id E1B341E813 for ; Tue, 15 Jun 2021 07:15:21 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A9F8F398643F for ; Tue, 15 Jun 2021 11:15:21 +0000 (GMT) Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) by sourceware.org (Postfix) with ESMTPS id D284F3840026 for ; Tue, 15 Jun 2021 11:14:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D284F3840026 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=palves.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-wr1-f44.google.com with SMTP id m18so17871244wrv.2 for ; Tue, 15 Jun 2021 04:14:36 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=WMZY4OQRN7I3FoNAeq4md+bhIgcPTolgkkNqzdxdK3Q=; b=uDF/6JKEgFrnVDgMa1sIQ2lWuox1WrjElJL03EHklFehwAQS5RQoARWH5KyXOgAcYr y/qEUkLiv7E1opkaq4YLo2swz6aBe9uV4vtJfmDz6lmCKBYeziUmzrcZFn1Wc2Z9r5Yt OpZTXGRBgMhEEOHKC24CNPxFfPa5FM5vwxBejpA9mak1RB/jUIt4A3rYYuCOFfpzO5iV Htbzo2pbuWo64XP7VRWoyErBClYnVeDl9EPx7BgU8CIPtRFZ3Lps0sOyb+pDUgVkTCeG FpWjdx+4Eu+uSC+Eel6tDbRnZ0Bd74kwgwgm96M5Yn3QgOsgSaeLEo6CfA3kaLBJRKa8 VfyQ== X-Gm-Message-State: AOAM530G3Gy6BER3zZUCXS/RV0ftqRa8BWaAsrtzNn0kDbjJYcaSLL/z kym12r4a+/t69A3AJqtaVhXWGCKlEau97A== X-Google-Smtp-Source: ABdhPJwnnwl6H2uQEEWzBW/MtVl47OtL4noykrYRqIrHkmA3tqM7XB8Ak3FU5UK1zZaZiftxi1/Ang== X-Received: by 2002:a5d:66c6:: with SMTP id k6mr3229158wrw.422.1623755675376; Tue, 15 Jun 2021 04:14:35 -0700 (PDT) Received: from localhost ([2001:8a0:f932:6a00:6b6e:c7b6:c5a7:aac3]) by smtp.gmail.com with ESMTPSA id o18sm1855664wmh.38.2021.06.15.04.14.34 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 15 Jun 2021 04:14:34 -0700 (PDT) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 2/4] Introduce scoped_restore_signal Date: Tue, 15 Jun 2021 12:14:27 +0100 Message-Id: <20210615111429.1879286-3-pedro@palves.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210615111429.1879286-1-pedro@palves.net> References: <20210615111429.1879286-1-pedro@palves.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org Sender: "Gdb-patches" We currently have scoped_restore_sigttou and scoped_restore_sigpipe doing basically the same thing -- temporarily ignoring a specific signal. This patch introduce a scoped_restore_signal type that can be used for both. This will become more important for the next patch which changes how the signal-ignoring is implemented. scoped_restore_sigpipe is a straight alias to scoped_restore_signal on systems that define SIGPIPE, and an alias to scoped_restore_signal_nop (a no-op version of scoped_restore_signal) otherwise. scoped_restore_sigttou is not a straight alias because it wants to check the job_control global. gdb/ChangeLog: yyyy-mm-dd Pedro Alves * gdbsupport/scoped_ignore_signal.h: New. * compile/compile.c: Include gdbsupport/scoped_ignore_signal.h instead of . Don't include . (scoped_ignore_sigpipe): Remove. * gdbsupport/scoped_ignore_sigttou.h: Include gdbsupport/scoped_ignore_signal.h instead of . Don't include . (lazy_init): New. (scoped_ignore_sigttou): Reimplement using scoped_ignore_signal and lazy_init. Change-Id: Ibb44d0bd705e96df03ef0787c77358a4a7b7086c --- gdb/compile/compile.c | 29 +------------- gdbsupport/scoped_ignore_signal.h | 64 ++++++++++++++++++++++++++++++ gdbsupport/scoped_ignore_sigttou.h | 48 ++++++++++++++++------ 3 files changed, 101 insertions(+), 40 deletions(-) create mode 100644 gdbsupport/scoped_ignore_signal.h diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c index abbb72a393c..e815348ff07 100644 --- a/gdb/compile/compile.c +++ b/gdb/compile/compile.c @@ -43,7 +43,7 @@ #include "gdbsupport/gdb_optional.h" #include "gdbsupport/gdb_unlinker.h" #include "gdbsupport/pathstuff.h" -#include +#include "gdbsupport/scoped_ignore_signal.h" @@ -634,33 +634,6 @@ print_callback (void *ignore, const char *message) fputs_filtered (message, gdb_stderr); } -/* RAII class used to ignore SIGPIPE in a scope. */ - -class scoped_ignore_sigpipe -{ -public: - scoped_ignore_sigpipe () - { -#ifdef SIGPIPE - m_osigpipe = signal (SIGPIPE, SIG_IGN); -#endif - } - - ~scoped_ignore_sigpipe () - { -#ifdef SIGPIPE - signal (SIGPIPE, m_osigpipe); -#endif - } - - DISABLE_COPY_AND_ASSIGN (scoped_ignore_sigpipe); - -private: -#ifdef SIGPIPE - sighandler_t m_osigpipe = NULL; -#endif -}; - /* Process the compilation request. On success it returns the object and source file names. On an error condition, error () is called. */ diff --git a/gdbsupport/scoped_ignore_signal.h b/gdbsupport/scoped_ignore_signal.h new file mode 100644 index 00000000000..cccd390529b --- /dev/null +++ b/gdbsupport/scoped_ignore_signal.h @@ -0,0 +1,64 @@ +/* Support for ignoring signals. + + Copyright (C) 2021 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef SCOPED_IGNORE_SIGNAL_H +#define SCOPED_IGNORE_SIGNAL_H + +#include + +/* RAII class used to ignore a signal in a scope. */ + +template +class scoped_ignore_signal +{ +public: + scoped_ignore_signal () + { + m_osig = signal (Sig, SIG_IGN); + } + + ~scoped_ignore_signal () + { + signal (Sig, m_osig); + } + + DISABLE_COPY_AND_ASSIGN (scoped_ignore_signal); + +private: + sighandler_t m_osig = nullptr; +}; + +struct scoped_ignore_signal_nop +{ + /* Note, these can't both be "= default", because otherwise the + compiler warns that variables of this type are not used. */ + scoped_ignore_signal_nop () + {} + ~scoped_ignore_signal_nop () + {} + DISABLE_COPY_AND_ASSIGN (scoped_ignore_signal_nop); +}; + +#ifdef SIGPIPE +using scoped_ignore_sigpipe = scoped_ignore_signal; +#else +using scoped_ignore_sigpipe = scoped_ignore_signal_nop; +#endif + +#endif /* SCOPED_IGNORE_SIGNAL_H */ diff --git a/gdbsupport/scoped_ignore_sigttou.h b/gdbsupport/scoped_ignore_sigttou.h index a31316460b4..7b29f2b79a3 100644 --- a/gdbsupport/scoped_ignore_sigttou.h +++ b/gdbsupport/scoped_ignore_sigttou.h @@ -20,37 +20,61 @@ #ifndef SCOPED_IGNORE_SIGTTOU_H #define SCOPED_IGNORE_SIGTTOU_H -#include -#include +#include "gdbsupport/scoped_ignore_signal.h" #include "gdbsupport/job-control.h" -/* RAII class used to ignore SIGTTOU in a scope. */ +#ifdef SIGTTOU + +/* Simple wrapper that allows lazy initialization / destruction of T. + Slightly more efficient than gdb::optional, because it doesn't + carry storage to track whether the object has been initialized. */ +template +class lazy_init +{ +public: + void emplace () + { + new (m_buf) T (); + } + + void reset () + { + reinterpret_cast (m_buf)->~T (); + } + +private: + alignas (T) gdb_byte m_buf[sizeof (T)]; +}; + +/* RAII class used to ignore SIGTTOU in a scope. This isn't simply + scoped_ignore_signal because we want to check the + `job_control' global. */ class scoped_ignore_sigttou { public: scoped_ignore_sigttou () { -#ifdef SIGTTOU if (job_control) - m_osigttou = signal (SIGTTOU, SIG_IGN); -#endif + m_ignore_signal.emplace (); } ~scoped_ignore_sigttou () { -#ifdef SIGTTOU if (job_control) - signal (SIGTTOU, m_osigttou); -#endif + m_ignore_signal.reset (); } DISABLE_COPY_AND_ASSIGN (scoped_ignore_sigttou); private: -#ifdef SIGTTOU - sighandler_t m_osigttou = NULL; -#endif + lazy_init> m_ignore_signal; }; +#else + +using scoped_ignore_sigttou = scoped_ignore_signal_nop; + +#endif + #endif /* SCOPED_IGNORE_SIGTTOU_H */ -- 2.26.2