From a100bb2af8afc5fb61abc54e0b616cc44bb0b814 Mon Sep 17 00:00:00 2001
From: lichao <lichao@aiotlink.com>
Date: 星期五, 26 三月 2021 15:53:35 +0800
Subject: [PATCH] adjust mq length.

---
 src/shm_queue.h |   13 +++++++++----
 1 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/shm_queue.h b/src/shm_queue.h
index d0eb972..140654c 100644
--- a/src/shm_queue.h
+++ b/src/shm_queue.h
@@ -53,9 +53,11 @@
     using Super::size;
     using Super::capacity;
     const MQId &Id() const { return id_; }
-    bool Write(D buf, const int timeout_ms) {
+    template <class OnWrite>
+    bool Write(const D &buf, const int timeout_ms, const OnWrite &onWrite) {
         Guard lock(mutex());
         if (cond_write_.timed_wait(lock, MSFromNow(timeout_ms), [&]() { return !this->full(); })) {
+            onWrite();
             this->push_back(buf);
             cond_read_.notify_one();
             return true;
@@ -63,11 +65,13 @@
             return false;
         }
     }
+    bool Write(const D &buf, const int timeout_ms) { return Write(buf, timeout_ms, [](){}); }
 
     bool Read(D &buf, const int timeout_ms){
         Guard lock(mutex());
         if (cond_read_.timed_wait(lock, MSFromNow(timeout_ms), [&]() { return !this->empty(); })) {
-            buf = this->front();
+            using std::swap;
+            swap(buf, this->front());
             this->pop_front();
             cond_write_.notify_one();
             return true;
@@ -84,13 +88,14 @@
     bool Write(const Msg &buf, const int timeout_ms) { return data()->Write(buf, timeout_ms); }
     bool Read(Msg &buf, const int timeout_ms) { return data()->Read(buf, timeout_ms); }
 public:
-    ShmMsgQueue(const MQId &id, ShmType &segment, const uint32_t len);
-    ShmMsgQueue(ShmType &segment, const uint32_t len);
+    ShmMsgQueue(const MQId &id, ShmType &segment, const int len);
+    ShmMsgQueue(ShmType &segment, const int len);
     ~ShmMsgQueue();
     bool Send(const MQId &remote_id, const void *data, const size_t size, const int timeout_ms);
     bool Recv(MQId &source_id, void *&data, size_t &size, const int timeout_ms);
     const MQId &Id() const { return data()->Id(); }
     bool Send(const MQId &remote_id, const Msg &msg, const int timeout_ms);
+    bool Recv(Msg &msg, const int timeout_ms) { return Read(msg, timeout_ms); }
 };
 
 } // namespace bhome_shm

--
Gitblit v1.8.0