Leave our wakeup signal blocked after destroying the ShmEventLoop
This will avoid late-arriving wakeup signals killing the process
(instead of letting it shut down normally).
Change-Id: Ie87c3535c6cb884df270f268fe8b02ea9118a245
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/events/shm_event_loop.cc b/aos/events/shm_event_loop.cc
index 9d010b7..e15c014 100644
--- a/aos/events/shm_event_loop.cc
+++ b/aos/events/shm_event_loop.cc
@@ -1035,6 +1035,7 @@
if (watchers_.size() > 0) {
signalfd_.reset(new ipc_lib::SignalFd({ipc_lib::kWakeupSignal}));
+ signalfd_->LeaveSignalBlocked(ipc_lib::kWakeupSignal);
epoll_.OnReadable(signalfd_->fd(), [this]() { HandleEvent(); });
}
diff --git a/aos/ipc_lib/signalfd.cc b/aos/ipc_lib/signalfd.cc
index 384baaa..c9634a5 100644
--- a/aos/ipc_lib/signalfd.cc
+++ b/aos/ipc_lib/signalfd.cc
@@ -76,7 +76,7 @@
CHECK_EQ(0, wrapped_pthread_sigmask(SIG_BLOCK, &blocked_mask_, &old_mask));
for (int signal : signals) {
if (sigismember(&old_mask, signal)) {
- CHECK_EQ(0, sigdelset(&blocked_mask_, signal));
+ LeaveSignalBlocked(signal);
}
}
}
@@ -119,4 +119,8 @@
return result;
}
+void SignalFd::LeaveSignalBlocked(unsigned int signal) {
+ CHECK_EQ(0, sigdelset(&blocked_mask_, signal));
+}
+
} // namespace aos::ipc_lib
diff --git a/aos/ipc_lib/signalfd.h b/aos/ipc_lib/signalfd.h
index a2c2549..3afdf99 100644
--- a/aos/ipc_lib/signalfd.h
+++ b/aos/ipc_lib/signalfd.h
@@ -26,6 +26,11 @@
// will be 0.
signalfd_siginfo Read();
+ // Ensures the destructor will leave the specific signal blocked. This can be
+ // helpful if the signal is sent asynchronously, such that it may arrive after
+ // this object is destroyed, to ensure that doesn't kill the process.
+ void LeaveSignalBlocked(unsigned int signal);
+
private:
int fd_ = -1;