Files
binutils-gdb/gdb/gdbsupport/block-signals.h
Tom Tromey 236bb4b23d Add RAII class for blocking gdb signals
This adds configury support and an RAII class that can be used to
temporarily block signals that are used by gdb.  (This class is not
used in this patch, but it split out for easier review.)

The idea of this patch is that these signals should only be delivered
to the main thread.  So, when creating a background thread, they are
temporarily blocked; the blocked state is inherited by the new thread.

gdb/ChangeLog
2019-09-30  Tom Tromey  <tom@tromey.com>

	* gdbsupport/common.m4 (GDB_AC_COMMON): Check for
	pthread_sigmask.
	* configure: Rebuild.
	* gdbsupport/block-signals.h: New file.

gdb/gdbserver/ChangeLog
2019-09-30  Tom Tromey  <tom@tromey.com>

	* configure: Rebuild.
2019-09-30 20:30:39 -06:00

66 lines
1.6 KiB
C++

/* Block signals used by gdb
Copyright (C) 2019 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 <http://www.gnu.org/licenses/>. */
#ifndef GDBSUPPORT_BLOCK_SIGNALS_H
#define GDBSUPPORT_BLOCK_SIGNALS_H
#include <signal.h>
namespace gdb
{
/* This is an RAII class that temporarily blocks the signals needed by
gdb. This can be used before starting a new thread to ensure that
this thread starts with the appropriate signals blocked. */
class block_signals
{
public:
block_signals ()
{
#ifdef HAVE_PTHREAD_SIGMASK
sigset_t mask;
sigemptyset (&mask);
sigaddset (&mask, SIGINT);
sigaddset (&mask, SIGCHLD);
sigaddset (&mask, SIGALRM);
sigaddset (&mask, SIGWINCH);
pthread_sigmask (SIG_BLOCK, &mask, &m_old_mask);
#endif
}
~block_signals ()
{
#ifdef HAVE_PTHREAD_SIGMASK
pthread_sigmask (SIG_SETMASK, &m_old_mask, nullptr);
#endif
}
DISABLE_COPY_AND_ASSIGN (block_signals);
private:
#ifdef HAVE_PTHREAD_SIGMASK
sigset_t m_old_mask;
#endif
};
}
#endif /* GDBSUPPORT_BLOCK_SIGNALS_H */