Просмотр исходного кода

BSignal: don't dispatch signals in a loop one after another, it breaks the jobs system. Instead simply dispatch one signal per fd handler.

ambrop7 15 лет назад
Родитель
Сommit
c0b69bf40c
1 измененных файлов с 15 добавлено и 14 удалено
  1. 15 14
      system/BSignal.c

+ 15 - 14
system/BSignal.c

@@ -108,21 +108,22 @@ static void signal_fd_handler (void *user, int events)
     ASSERT(bsignal_global.capturing)
     ASSERT(bsignal_global.handler)
     
-    do {
-        struct signalfd_siginfo siginfo;
-        int bytes = read(bsignal_global.signal_fd, &siginfo, sizeof(siginfo));
-        if (bytes < 0) {
-            int error = errno;
-            if (error == EAGAIN || error == EWOULDBLOCK) {
-                break;
-            }
-            ASSERT_FORCE(0)
+    struct signalfd_siginfo siginfo;
+    int bytes = read(bsignal_global.signal_fd, &siginfo, sizeof(siginfo));
+    if (bytes < 0) {
+        int error = errno;
+        if (error == EAGAIN || error == EWOULDBLOCK) {
+            return;
         }
-        ASSERT_FORCE(bytes == sizeof(siginfo))
-        
-        BLog(BLOG_DEBUG, "Dispatching signal");
-        bsignal_global.handler(bsignal_global.handler_user);
-    } while (bsignal_global.capturing && bsignal_global.handler);
+        ASSERT_FORCE(0)
+    }
+    ASSERT_FORCE(bytes == sizeof(siginfo))
+    
+    BLog(BLOG_DEBUG, "Dispatching signal");
+    
+    // call handler
+    bsignal_global.handler(bsignal_global.handler_user);
+    return;
 }
 
 #endif