Debugger: Add utility class SignalSet
This commit is contained in:
parent
8c663339c8
commit
71e5d26b5f
152
src/apps/debugger/util/SignalSet.h
Normal file
152
src/apps/debugger/util/SignalSet.h
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef SIGNAL_SET_H
|
||||||
|
#define SIGNAL_SET_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
|
||||||
|
class SignalSet {
|
||||||
|
public:
|
||||||
|
SignalSet();
|
||||||
|
SignalSet(int signal);
|
||||||
|
SignalSet(const sigset_t& signals);
|
||||||
|
|
||||||
|
void SetTo(const sigset_t& signals);
|
||||||
|
void SetTo(int signal);
|
||||||
|
|
||||||
|
const sigset_t& Signals() const { return fSignals; }
|
||||||
|
|
||||||
|
bool ContainsSignal(int signal) const;
|
||||||
|
|
||||||
|
SignalSet& AddSignal(int signal);
|
||||||
|
SignalSet& AddSignals(const SignalSet& signals);
|
||||||
|
SignalSet& RemoveSignal(int signal);
|
||||||
|
SignalSet& RemoveSignals(const SignalSet& signals);
|
||||||
|
|
||||||
|
status_t BlockInCurrentThread(
|
||||||
|
SignalSet* oldMask = NULL) const;
|
||||||
|
status_t UnblockInCurrentThread(
|
||||||
|
SignalSet* oldMask = NULL) const;
|
||||||
|
status_t SetCurrentThreadSignalMask(
|
||||||
|
SignalSet* oldMask = NULL) const;
|
||||||
|
|
||||||
|
static SignalSet CurrentThreadSignalMask();
|
||||||
|
|
||||||
|
private:
|
||||||
|
sigset_t fSignals;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
SignalSet::SignalSet()
|
||||||
|
{
|
||||||
|
sigemptyset(&fSignals);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SignalSet::SignalSet(int signal)
|
||||||
|
{
|
||||||
|
SetTo(signal);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SignalSet::SignalSet(const sigset_t& signals)
|
||||||
|
:
|
||||||
|
fSignals(signals)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SignalSet::SetTo(const sigset_t& signals)
|
||||||
|
{
|
||||||
|
fSignals = signals;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SignalSet::SetTo(int signal)
|
||||||
|
{
|
||||||
|
sigemptyset(&fSignals);
|
||||||
|
sigaddset(&fSignals, signal);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
SignalSet::ContainsSignal(int signal) const
|
||||||
|
{
|
||||||
|
return sigismember(&fSignals, signal) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SignalSet&
|
||||||
|
SignalSet::AddSignal(int signal)
|
||||||
|
{
|
||||||
|
sigaddset(&fSignals, signal);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SignalSet&
|
||||||
|
SignalSet::AddSignals(const SignalSet& signals)
|
||||||
|
{
|
||||||
|
// NOTE: That is not portable.
|
||||||
|
fSignals |= signals.fSignals;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SignalSet&
|
||||||
|
SignalSet::RemoveSignal(int signal)
|
||||||
|
{
|
||||||
|
sigdelset(&fSignals, signal);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SignalSet&
|
||||||
|
SignalSet::RemoveSignals(const SignalSet& signals)
|
||||||
|
{
|
||||||
|
// NOTE: That is not portable.
|
||||||
|
fSignals &= ~signals.fSignals;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
SignalSet::BlockInCurrentThread(SignalSet* oldMask) const
|
||||||
|
{
|
||||||
|
return pthread_sigmask(SIG_BLOCK, &fSignals,
|
||||||
|
oldMask != NULL ? &oldMask->fSignals : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
SignalSet::UnblockInCurrentThread(SignalSet* oldMask) const
|
||||||
|
{
|
||||||
|
return pthread_sigmask(SIG_UNBLOCK, &fSignals,
|
||||||
|
oldMask != NULL ? &oldMask->fSignals : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
SignalSet::SetCurrentThreadSignalMask(SignalSet* oldMask) const
|
||||||
|
{
|
||||||
|
return pthread_sigmask(SIG_SETMASK, &fSignals,
|
||||||
|
oldMask != NULL ? &oldMask->fSignals : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*static*/ SignalSet
|
||||||
|
SignalSet::CurrentThreadSignalMask()
|
||||||
|
{
|
||||||
|
SignalSet signals;
|
||||||
|
pthread_sigmask(SIG_BLOCK, NULL, &signals.fSignals);
|
||||||
|
return signals;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // SIGNAL_SET_H
|
Loading…
Reference in New Issue
Block a user