From 3a5e5ca9bce4bd4956e59e76a95f0ec207d711ff Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期一, 25 一月 2021 17:00:01 +0800 Subject: [PATCH] 解决kill -9问题 --- src/queue/lock_free_queue.h | 42 ++++++++++++++++++++++++++++++------------ 1 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/queue/lock_free_queue.h b/src/queue/lock_free_queue.h index 723e373..9f03437 100644 --- a/src/queue/lock_free_queue.h +++ b/src/queue/lock_free_queue.h @@ -210,28 +210,37 @@ 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"); + // 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) { - return errno; + goto LABEL_FAILTURE; } } else if ((flag & BUS_TIMEOUT_FLAG) == BUS_TIMEOUT_FLAG && timeout != NULL) { if (psem_timedwait(&slots, timeout) == -1) { - return errno; + goto LABEL_FAILTURE; } } else { if (psem_wait(&slots) == -1) { - return errno; + goto LABEL_FAILTURE; } } if (m_qImpl.push(a_data)) { psem_post(&items); + sigprocmask(SIG_SETMASK, &pre, NULL); LoggerFactory::getLogger()->debug("==================LockFreeQueue push after\n"); return 0; } - return -1; + +LABEL_FAILTURE: + sigprocmask(SIG_SETMASK, &pre, NULL); + return errno; } @@ -239,30 +248,39 @@ 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...."); + + 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) { - return errno; + 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); + // LoggerFactory::getLogger()->debug("==================LockFreeQueue pop before. flag=%d , %d\n", flag, timeout->tv_sec); if (psem_timedwait(&items, timeout) == -1) { - return errno; + goto LABEL_FAILTURE; } } else { if (psem_wait(&items) == -1) { - return errno; + goto LABEL_FAILTURE; } } if (m_qImpl.pop(a_data)) { psem_post(&slots); - LoggerFactory::getLogger()->debug("==================LockFreeQueue pop after\n"); + sigprocmask(SIG_SETMASK, &pre, NULL); + // 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