From 0182d4f033f2ef736005ec300c2b330614d10cad Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期一, 25 一月 2021 17:50:24 +0800
Subject: [PATCH] fix kill -9

---
 src/queue/lock_free_queue.h |  104 ++++++++++++++++++++++++++++++----------------------
 1 files changed, 60 insertions(+), 44 deletions(-)

diff --git a/src/queue/lock_free_queue.h b/src/queue/lock_free_queue.h
index 9245d3e..70549d4 100644
--- a/src/queue/lock_free_queue.h
+++ b/src/queue/lock_free_queue.h
@@ -207,63 +207,79 @@
 
 
 template<typename ELEM_T,
-        typename Allocator,
-        template<typename T, typename AT> class Q_TYPE>
+      typename Allocator,
+      template<typename T, typename AT> class Q_TYPE>
 int LockFreeQueue<ELEM_T, Allocator, Q_TYPE>::push(const ELEM_T &a_data, const struct timespec *timeout, int flag) {
-    LoggerFactory::getLogger()->debug("==================LockFreeQueue push before\n");
-    if ((flag & BUS_NOWAIT_FLAG) == BUS_NOWAIT_FLAG) {
-        if (psem_trywait(&slots) == -1) {
-            return -1;
-        }
-    } else if ((flag & BUS_TIMEOUT_FLAG) == BUS_TIMEOUT_FLAG && timeout != NULL) {
-        if (psem_timedwait(&slots, timeout) == -1) {
-            return -1;
-        }
-    } else {
-        if (psem_wait(&slots) == -1) {
-            return -1;
-        }
-    }
+  // LoggerFactory::getLogger()->debug("==================LockFreeQueue push before\n");
+  sigset_t mask_all, pre;
+  sigfillset(&mask_all);
+
+  sigprocmask(SIG_BLOCK, &mask_all, &pre);
+
+  if ((flag & BUS_NOWAIT_FLAG) == BUS_NOWAIT_FLAG) {
+      if (psem_trywait(&slots) == -1) {
+          goto LABEL_FAILTURE;
+      }
+  } else if ((flag & BUS_TIMEOUT_FLAG) == BUS_TIMEOUT_FLAG && timeout != NULL) {
+      if (psem_timedwait(&slots, timeout) == -1) {
+          goto LABEL_FAILTURE;
+      }
+  } else {
+      if (psem_wait(&slots) == -1) {
+          goto LABEL_FAILTURE;
+      }
+  }
 
 
-    if (m_qImpl.push(a_data)) {
-        psem_post(&items);
-        LoggerFactory::getLogger()->debug("==================LockFreeQueue push after\n");
-        return 0;
-    }
-    return -1;
-
+  if (m_qImpl.push(a_data)) {
+    psem_post(&items);
+    sigprocmask(SIG_SETMASK, &pre, NULL);
+    LoggerFactory::getLogger()->debug("==================LockFreeQueue push after\n");
+    return 0;
+  }
+  
+LABEL_FAILTURE:
+  sigprocmask(SIG_SETMASK, &pre, NULL);
+  return errno;
 }
 
 template<typename ELEM_T,
         typename Allocator,
         template<typename T, typename AT> class Q_TYPE>
 int LockFreeQueue<ELEM_T, Allocator, Q_TYPE>::pop(ELEM_T &a_data, const struct timespec *timeout, int flag) {
+  // LoggerFactory::getLogger()->debug("==================LockFreeQueue pop before....");
 
-    LoggerFactory::getLogger()->debug("==================LockFreeQueue pop before\n");
+  sigset_t mask_all, pre;
+  sigfillset(&mask_all);
+
+  sigprocmask(SIG_BLOCK, &mask_all, &pre);
+
+  if ((flag & BUS_NOWAIT_FLAG) == BUS_NOWAIT_FLAG) {
+      if (psem_trywait(&items) == -1) {
+         goto LABEL_FAILTURE;
+      }
+  } else if ((flag & BUS_TIMEOUT_FLAG) == BUS_TIMEOUT_FLAG && timeout != NULL) {
+    // LoggerFactory::getLogger()->debug("==================LockFreeQueue pop before. flag=%d ,  %d\n", flag, timeout->tv_sec);
+      if (psem_timedwait(&items, timeout) == -1) {
+          goto LABEL_FAILTURE;
+      }
+  } else {
+      if (psem_wait(&items) == -1) {
+          goto LABEL_FAILTURE;
+      }
+  }
 
 
-    if ((flag & BUS_NOWAIT_FLAG) == BUS_NOWAIT_FLAG) {
-        if (psem_trywait(&items) == -1) {
-            return -1;
-        }
-    } else if ((flag & BUS_TIMEOUT_FLAG) == BUS_TIMEOUT_FLAG && timeout != NULL) {
-        if (psem_timedwait(&items, timeout) == -1) {
-            return -1;
-        }
-    } else {
-        if (psem_wait(&items) == -1) {
-            return -1;
-        }
-    }
+  if (m_qImpl.pop(a_data)) {
+      psem_post(&slots);
+      sigprocmask(SIG_SETMASK, &pre, NULL);
+      // LoggerFactory::getLogger()->debug("==================LockFreeQueue pop after\n");
+      return 0;
+  }
 
-
-    if (m_qImpl.pop(a_data)) {
-        psem_post(&slots);
-        LoggerFactory::getLogger()->debug("==================LockFreeQueue pop after\n");
-        return 0;
-    }
-    return -1;
+LABEL_FAILTURE:
+  sigprocmask(SIG_SETMASK, &pre, NULL);
+  return errno;
 }
 
 template<typename ELEM_T,

--
Gitblit v1.8.0