30 return (registered_signals);
44 return (signal_states);
59void internalHandler(
int sig) {
68 for (std::list<int>::const_iterator it = states->begin();
69 it != states->end(); ++it) {
76 states->push_back(sig);
89 if (!onreceipt_handler_) {
97 struct sigaction prev_sa;
98 memset(&sa, 0,
sizeof(sa));
99 sa.sa_handler = SIG_IGN;
100 if (sigaction(sig, &sa, &prev_sa) < 0) {
102 const char* errmsg = strerror(errno);
104 << sig <<
": " << errmsg);
108 bool signal_processed =
false;
110 signal_processed = onreceipt_handler_(sig);
111 }
catch (
const std::exception& ex) {
118 static_cast<void>(sigaction(sig, &prev_sa, 0));
120 << sig <<
": " << ex.
what());
124 if (sigaction(sig, &prev_sa, 0) < 0) {
126 const char* errmsg = strerror(errno);
128 << sig <<
": " << errmsg);
131 return (signal_processed);
136 registered_signals_ = getRegisteredSignals();
137 signal_states_ = getSignalStates();
142 registered_signals_ = getRegisteredSignals();
143 signal_states_ = getSignalStates();
149 registered_signals_ = getRegisteredSignals();
150 signal_states_ = getSignalStates();
171 memset(&sa, 0,
sizeof(sa));
172 sa.sa_handler = internalHandler;
173 sigfillset(&sa.sa_mask);
174 if (sigaction(sig, &sa, 0) < 0) {
175 const char* errmsg = strerror(errno);
178 " signal " << sig <<
": " << errmsg);
183SignalSet::block()
const {
184 maskSignals(SIG_BLOCK);
193 std::set<int> all_signals = local_signals_;
194 for (std::set<int>::const_iterator it = all_signals.begin();
195 it != all_signals.end(); ++it) {
202 for (std::list<int>::iterator it = signal_states_->begin();
203 it != signal_states_->end(); ++it) {
204 if (local_signals_.find(*it) != local_signals_.end()) {
212SignalSet::erase(
const int sig) {
213 if (local_signals_.find(sig) == local_signals_.end()) {
215 <<
" from a signal set: signal is not owned by the"
219 registered_signals_->erase(sig);
221 for (std::list<int>::iterator it = signal_states_->begin();
222 it != signal_states_->end(); ++it) {
224 it = signal_states_->erase(it);
229 local_signals_.erase(sig);
239 signal_handler(signum);
249SignalSet::insert(
const int sig) {
250 if ((registered_signals_->find(sig) != registered_signals_->end()) ||
251 (local_signals_.find(sig) != local_signals_.end())) {
255 registered_signals_->insert(sig);
256 local_signals_.insert(sig);
260SignalSet::maskSignals(
const int mask)
const {
262 sigemptyset(&new_set);
263 for (std::set<int>::const_iterator it = registered_signals_->begin();
264 it != registered_signals_->end(); ++it) {
265 sigaddset(&new_set, *it);
267 pthread_sigmask(mask, &new_set, 0);
271SignalSet::popNext() {
272 for (std::list<int>::iterator it = signal_states_->begin();
273 it != signal_states_->end(); ++it) {
274 if (local_signals_.find(*it) != local_signals_.end()) {
275 signal_states_->erase(it);
284 if (local_signals_.find(sig) != local_signals_.end()) {
286 memset(&sa, 0,
sizeof(sa));
287 sa.sa_handler = SIG_DFL;
288 sigfillset(&sa.sa_mask);
289 if (sigaction(sig, &sa, 0) < 0) {
291 " handler for signal: " << sig);
296 <<
": this signal is not owned by the signal set");
301SignalSet::unblock()
const {
302 maskSignals(SIG_UNBLOCK);
308 onreceipt_handler_ = handler;
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
Exception thrown when the isc::util::SignalSet class experiences an error.
static void setOnReceiptHandler(BoolSignalHandler handler)
Registers a handler as the onreceipt signal handler.
void handleNext(SignalHandler signal_handler)
Calls a handler for the next received signal.
static bool invokeOnReceiptHandler(int sig)
Invokes the onreceipt handler if it exists.
int getNext() const
Returns a code of the next received signal.
SignalSet(const int sig0)
Constructor installing one signal.
void add(const int sig)
Installs the handler for the specified signal.
void remove(const int sig)
Uninstalls signal handler for a specified signal.
static void clearOnReceiptHandler()
Unregisters the onreceipt signal handler.
void clear()
Uninstalls all signals.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
std::list< int > SigIntList
Defines a list of integer signal identifiers: SIGHUP, SIGTERM...
boost::shared_ptr< SigIntList > SigIntListPtr
Pointer to a list of signal identifiers.
boost::shared_ptr< SigIntSet > SigIntSetPtr
Pointer to a set of signal identifiers.
std::set< int > SigIntSet
Defines a set of integer signal identifiers: SIGHUP, SIGTERM...
boost::function< bool(int signum)> BoolSignalHandler
Pointer to a signal handling function which returns bool result.
boost::function< void(int signum)> SignalHandler
Pointer to the signal handling function.
Defines the logger used by the top-level component of kea-dhcp-ddns.