From acbf282b23b4cbdebca562d67132573de3902f94 Mon Sep 17 00:00:00 2001
From: Fu Juntang <StrongTiger_001@163.com>
Date: 星期五, 17 九月 2021 10:45:43 +0800
Subject: [PATCH] Merge branch 'master' of http://os.smartai.com:9091/valib/c_bhomebus
---
src/queue/lock_free_queue.h | 87 ++++++++++++++++++++++---------------------
1 files changed, 45 insertions(+), 42 deletions(-)
diff --git a/src/queue/lock_free_queue.h b/src/queue/lock_free_queue.h
index 31f2cc1..6363ccb 100644
--- a/src/queue/lock_free_queue.h
+++ b/src/queue/lock_free_queue.h
@@ -15,7 +15,7 @@
#include "bus_def.h"
// default Queue size
-#define LOCK_FREE_Q_DEFAULT_SIZE 16
+#define LOCK_FREE_Q_DEFAULT_SIZE 320
#define LOCK_FREE_Q_ST_OPENED 0
@@ -88,9 +88,9 @@
sem_t slots;
sem_t items;
- // time_t createTime;
- // time_t closeTime;
- // int status;
+ time_t createTime;
+ time_t closeTime;
+ int status;
public:
@@ -101,7 +101,8 @@
/// template
~LockFreeQueue();
- // inline void close();
+ inline void close();
+ inline bool isClosed();
// std::atomic_uint reference;
/// @brief constructor of the class
@@ -129,17 +130,17 @@
- // time_t getCreateTime() {
- // return createTime;
- // }
+ time_t getCreateTime() {
+ return createTime;
+ }
- // time_t getCloseTime() {
- // return closeTime;
- // }
+ time_t getCloseTime() {
+ return closeTime;
+ }
- // int getStatus() {
- // return status;
- // }
+ int getStatus() {
+ return status;
+ }
/// @brief push an element at the tail of the queue
/// @param the element to insert in the queue
@@ -176,26 +177,34 @@
typename Allocator,
template<typename T, typename AT> class Q_TYPE>
LockFreeQueue<ELEM_T, Allocator, Q_TYPE>::LockFreeQueue(size_t qsize): m_qImpl(qsize) {
- // std::cout << "LockFreeQueue init reference=" << reference << std::endl;
+ //std::cout << "LockFreeQueue init reference=" << reference << std::endl;
if (sem_init(&slots, 1, qsize) == -1)
err_exit(errno, "LockFreeQueue sem_init");
if (sem_init(&items, 1, 0) == -1)
err_exit(errno, "LockFreeQueue sem_init");
- // createTime = time(NULL);
- // status = LOCK_FREE_Q_ST_OPENED;
+ createTime = time(NULL);
+ status = LOCK_FREE_Q_ST_OPENED;
}
-// template<
-// typename ELEM_T,
-// typename Allocator,
-// template<typename T, typename AT> class Q_TYPE>
-// inline void LockFreeQueue<ELEM_T, Allocator, Q_TYPE>::close() {
-// // status = LOCK_FREE_Q_ST_CLOSED;
-// // closeTime = time(NULL);
-// }
+template<
+ typename ELEM_T,
+ typename Allocator,
+ template<typename T, typename AT> class Q_TYPE>
+inline void LockFreeQueue<ELEM_T, Allocator, Q_TYPE>::close() {
+ status = LOCK_FREE_Q_ST_CLOSED;
+ closeTime = time(NULL);
+}
+
+template<
+ typename ELEM_T,
+ typename Allocator,
+ template<typename T, typename AT> class Q_TYPE>
+inline bool LockFreeQueue<ELEM_T, Allocator, Q_TYPE>::isClosed() {
+ return status == LOCK_FREE_Q_ST_CLOSED;
+}
template<
@@ -203,7 +212,6 @@
typename Allocator,
template<typename T, typename AT> class Q_TYPE>
LockFreeQueue<ELEM_T, Allocator, Q_TYPE>::~LockFreeQueue() {
- // LoggerFactory::getLogger()->debug("LockFreeQueue desctroy");
if (sem_destroy(&slots) == -1) {
err_exit(errno, "LockFreeQueue sem_destroy");
}
@@ -242,11 +250,10 @@
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");
- // sigset_t mask_all, pre;
- // sigfillset(&mask_all);
+ sigset_t mask_all, pre;
+ sigfillset(&mask_all);
- // sigprocmask(SIG_BLOCK, &mask_all, &pre);
+ sigprocmask(SIG_BLOCK, &mask_all, &pre);
if ((flag & BUS_NOWAIT_FLAG) == BUS_NOWAIT_FLAG) {
if (psem_trywait(&slots) == -1) {
@@ -265,13 +272,12 @@
if (m_qImpl.push(a_data)) {
psem_post(&items);
- // sigprocmask(SIG_SETMASK, &pre, NULL);
- // LoggerFactory::getLogger()->debug("==================LockFreeQueue push after\n");
+ sigprocmask(SIG_SETMASK, &pre, NULL);
return 0;
}
LABEL_FAILTURE:
- // sigprocmask(SIG_SETMASK, &pre, NULL);
+ sigprocmask(SIG_SETMASK, &pre, NULL);
return errno;
}
@@ -279,20 +285,18 @@
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....");
- // sigset_t mask_all, pre;
- // sigfillset(&mask_all);
+ sigset_t mask_all, pre;
+ sigfillset(&mask_all);
- // sigprocmask(SIG_BLOCK, &mask_all, &pre);
+ 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) {
+ if (psem_timedwait(&items, timeout) == -1) {
goto LABEL_FAILTURE;
}
} else {
@@ -303,14 +307,13 @@
if (m_qImpl.pop(a_data)) {
psem_post(&slots);
- // sigprocmask(SIG_SETMASK, &pre, NULL);
- // LoggerFactory::getLogger()->debug("==================LockFreeQueue pop after\n");
+ sigprocmask(SIG_SETMASK, &pre, NULL);
return 0;
}
LABEL_FAILTURE:
- // sigprocmask(SIG_SETMASK, &pre, NULL);
+ sigprocmask(SIG_SETMASK, &pre, NULL);
return errno;
}
--
Gitblit v1.8.0