30 return (registered_signals);
44 return (signal_states);
59 void 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);
183 SignalSet::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()) {
212 SignalSet::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);
235 int signum = getNext();
239 signal_handler(signum);
249 SignalSet::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);
260 SignalSet::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);
271 SignalSet::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");
301 SignalSet::unblock()
const {
302 maskSignals(SIG_UNBLOCK);
308 onreceipt_handler_ = handler;