]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msgr: fix race with signals vs select with pselect
authorSage Weil <sage@newdream.net>
Tue, 14 Jul 2009 17:35:03 +0000 (10:35 -0700)
committerSage Weil <sage@newdream.net>
Tue, 14 Jul 2009 17:35:03 +0000 (10:35 -0700)
Fixes hang where accepter thread misses the stop signal and
doesn't shut down.

src/msg/SimpleMessenger.cc

index 089c5158d48c84b7cd93493e9c0a0265fb48954e..18124ad80c0a07f86298ecae665c57403890ac12 100644 (file)
@@ -175,11 +175,20 @@ void *SimpleMessenger::Accepter::entry()
   
   fd_set fds;
   int errors = 0;
+
+  sigset_t sigmask, sigempty;
+  sigemptyset(&sigmask);
+  sigaddset(&sigmask, SIGUSR1);
+  sigemptyset(&sigempty);
+
+  // block SIGUSR1
+  pthread_sigmask(SIG_BLOCK, &sigmask, NULL);
+
   while (!done) {
     FD_ZERO(&fds);
     FD_SET(listen_sd, &fds);
     dout(20) << "accepter calling select" << dendl;
-    int r = ::select(listen_sd+1, &fds, 0, &fds, 0);
+    int r = ::pselect(listen_sd+1, &fds, 0, &fds, 0, &sigempty);  // unblock SIGUSR1 inside select()
     dout(20) << "accepter select got " << r << dendl;
     
     if (done) break;
@@ -216,6 +225,9 @@ void *SimpleMessenger::Accepter::entry()
     }
   }
 
+  // unblock SIGUSR1
+  pthread_sigmask(SIG_UNBLOCK, &sigmask, NULL);
+
   dout(20) << "accepter closing" << dendl;
   // don't close socket, in case we start up again?  blech.
   if (listen_sd >= 0) {