<p>Pau Espin Pedrol <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13468">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">osmo-trx: Use signalfd to serialize signals in main thread ctx<br><br>This should avoid prolematic scenarios where different signal handlers<br>are running on different thread in parallel. Furthermore, we make sure<br>those signals are always run by main loop thread.<br><br>Change-Id: I9b9d9793be9af11dbe433e0ce09b7ac57a3bdfb5<br>---<br>M Transceiver52M/osmo-trx.cpp<br>1 file changed, 46 insertions(+), 5 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp</span><br><span>index 0141810..88b9de0 100644</span><br><span>--- a/Transceiver52M/osmo-trx.cpp</span><br><span>+++ b/Transceiver52M/osmo-trx.cpp</span><br><span>@@ -34,6 +34,7 @@</span><br><span> #include <string></span><br><span> #include <sstream></span><br><span> #include <iostream></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/signalfd.h></span><br><span> </span><br><span> #include <GSMCommon.h></span><br><span> #include <Logger.h></span><br><span>@@ -66,6 +67,7 @@</span><br><span> </span><br><span> static char* config_file = (char*)DEFAULT_CONFIG_FILE;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_fd signal_ofd;</span><br><span> volatile bool gshutdown = false;</span><br><span> </span><br><span> static void *tall_trx_ctx;</span><br><span>@@ -185,20 +187,57 @@</span><br><span>        case SIGUSR2:</span><br><span>                talloc_report_full(tall_trx_ctx, stderr);</span><br><span>            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIGHUP:</span><br><span style="color: hsl(120, 100%, 40%);">+          log_targets_reopen();</span><br><span>        default:</span><br><span>             break;</span><br><span>       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int signalfd_callback(struct osmo_fd *ofd, unsigned int what)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct signalfd_siginfo fdsi;</span><br><span style="color: hsl(120, 100%, 40%);">+ ssize_t s;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  s = read(ofd->fd, &fdsi, sizeof(struct signalfd_siginfo));</span><br><span style="color: hsl(120, 100%, 40%);">+     if (s < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOG(FATAL) << "Failed to read from signalfd ("<< ofd->fd << "): " << errno;</span><br><span style="color: hsl(120, 100%, 40%);">+            gshutdown = true;</span><br><span style="color: hsl(120, 100%, 40%);">+             return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     sig_handler(fdsi.ssi_signo);</span><br><span style="color: hsl(120, 100%, 40%);">+  return 0;</span><br><span> }</span><br><span> </span><br><span> static void setup_signal_handlers()</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Handle keyboard interrupt SIGINT */</span><br><span style="color: hsl(0, 100%, 40%);">-  signal(SIGINT, &sig_handler);</span><br><span style="color: hsl(0, 100%, 40%);">-       signal(SIGTERM, &sig_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+    sigset_t set;</span><br><span style="color: hsl(120, 100%, 40%);">+ int sfd;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   signal(SIGABRT, &sig_handler);</span><br><span style="color: hsl(0, 100%, 40%);">-      signal(SIGUSR1, &sig_handler);</span><br><span style="color: hsl(0, 100%, 40%);">-      signal(SIGUSR2, &sig_handler);</span><br><span>   osmo_init_ignore_signals();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Other threads created by this thread (main) will inherit a copy of the</span><br><span style="color: hsl(120, 100%, 40%);">+     signal mask. */</span><br><span style="color: hsl(120, 100%, 40%);">+       sigemptyset(&set);</span><br><span style="color: hsl(120, 100%, 40%);">+        sigaddset(&set, SIGINT);</span><br><span style="color: hsl(120, 100%, 40%);">+  sigaddset(&set, SIGTERM);</span><br><span style="color: hsl(120, 100%, 40%);">+ sigaddset(&set, SIGUSR1);</span><br><span style="color: hsl(120, 100%, 40%);">+ sigaddset(&set, SIGUSR2);</span><br><span style="color: hsl(120, 100%, 40%);">+ sigaddset(&set, SIGHUP);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (pthread_sigmask(SIG_BLOCK, &set, NULL)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             fprintf(stderr, "pthread_sigmask() failed.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             exit(EXIT_FAILURE);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if ((sfd = signalfd(-1, &set, 0)) == -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                fprintf(stderr, "signalfd() failed (%d).\n", errno);</span><br><span style="color: hsl(120, 100%, 40%);">+                exit(EXIT_FAILURE);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_fd_setup(&signal_ofd, sfd, OSMO_FD_READ, signalfd_callback, NULL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_fd_register(&signal_ofd);</span><br><span> }</span><br><span> </span><br><span> static void print_help()</span><br><span>@@ -594,5 +633,7 @@</span><br><span> </span><br><span>    trx_stop();</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_fd_unregister(&signal_ofd);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_fd_close(&signal_ofd);</span><br><span>      return 0;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13468">change 13468</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/13468"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-trx </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I9b9d9793be9af11dbe433e0ce09b7ac57a3bdfb5 </div>
<div style="display:none"> Gerrit-Change-Number: 13468 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>