From d3e7f93e69cb24c766292d8780e745caf24d42a8 Mon Sep 17 00:00:00 2001 From: lichao <lichao@aiotlink.com> Date: 星期四, 25 三月 2021 18:30:51 +0800 Subject: [PATCH] add ref count. --- src/shm_queue.cpp | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/shm_queue.cpp b/src/shm_queue.cpp index 1446446..77add97 100644 --- a/src/shm_queue.cpp +++ b/src/shm_queue.cpp @@ -48,8 +48,6 @@ bool ShmMsgQueue::Send(const MQId &remote_id, const Msg &msg, const int timeout_ms) { Queue *remote = find(MsgQIdToName(remote_id)); - - return remote && remote->Write(msg, timeout_ms); if(!remote) { return false; @@ -65,12 +63,19 @@ bool ShmMsgQueue::Send(const MQId &remote_id, const void *data, const size_t size, const int timeout_ms) { + // Test shows that in the 2 cases: + // 1) build msg first, then find remote queue; + // 2) find remote queue first, then build msg; + // 1 is about 50% faster than 2, maybe cache related. + Msg msg; if (msg.Build(shm(), Id(), data, size, false)) { if (Send(remote_id, msg, timeout_ms)) { return true; } else { - msg.FreeFrom(shm()); + if (msg.RemoveRef() == 0) { // works for both refcounted and not counted. + msg.FreeFrom(shm()); + } } } return false; @@ -80,9 +85,10 @@ { Msg msg; if (Read(msg, timeout_ms)) { + DEFER1(if (msg.RemoveRef() == 0) { msg.FreeFrom(shm()); }); + auto ptr = msg.get<char>(); if (ptr) { - DEFER1(shm().Dealloc(ptr);); MsgMetaV1 meta; meta.Parse(ptr); source_id = meta.src_id_; -- Gitblit v1.8.0