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;