This is an automated email from the ASF dual-hosted git repository.

chenBright pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brpc.git


The following commit(s) were added to refs/heads/master by this push:
     new 7696e88c Destroy MPSC queue elements before releasing nodes (#3620)
7696e88c is described below

commit 7696e88ca5c2d1f1478f69b56f11b506f8e87e3f
Author: nkysg <[email protected]>
AuthorDate: Sun Oct 18 10:44:52 2026 +0800

    Destroy MPSC queue elements before releasing nodes (#3620)
---
 src/butil/containers/mpsc_queue.h |  1 +
 test/mpsc_queue_unittest.cc       | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/src/butil/containers/mpsc_queue.h 
b/src/butil/containers/mpsc_queue.h
index 505b0a27..cbb48cb3 100644
--- a/src/butil/containers/mpsc_queue.h
+++ b/src/butil/containers/mpsc_queue.h
@@ -144,6 +144,7 @@ bool MPSCQueue<T, Alloc>::DequeueImpl(T* data) {
         ReverseList(node);
     }
     _cur_dequeue_node = node->next;
+    node->data_mem.Destroy();
     _alloc.Free(old_node);
 
     return true;
diff --git a/test/mpsc_queue_unittest.cc b/test/mpsc_queue_unittest.cc
index eae2f6f2..800e45ae 100644
--- a/test/mpsc_queue_unittest.cc
+++ b/test/mpsc_queue_unittest.cc
@@ -122,6 +122,42 @@ TEST(MPSCQueueTest, mpsc_multi_thread) {
 
 struct MyObject {};
 
+struct DestructionTracked {
+    static int alive;
+
+    DestructionTracked() { ++alive; }
+    DestructionTracked(const DestructionTracked&) { ++alive; }
+    DestructionTracked(DestructionTracked&&) { ++alive; }
+    DestructionTracked& operator=(const DestructionTracked&) { return *this; }
+    DestructionTracked& operator=(DestructionTracked&&) { return *this; }
+    ~DestructionTracked() { --alive; }
+};
+
+int DestructionTracked::alive = 0;
+
+TEST(MPSCQueueTest, destroys_pending_element) {
+    DestructionTracked::alive = 0;
+    {
+        butil::MPSCQueue<DestructionTracked> q;
+        DestructionTracked item;
+        q.Enqueue(item);
+        ASSERT_EQ(2, DestructionTracked::alive);
+    }
+    ASSERT_EQ(0, DestructionTracked::alive);
+}
+
+TEST(MPSCQueueTest, destroys_dequeued_element) {
+    DestructionTracked::alive = 0;
+    {
+        butil::MPSCQueue<DestructionTracked> q;
+        DestructionTracked item;
+        DestructionTracked out;
+        q.Enqueue(item);
+        ASSERT_TRUE(q.Dequeue(out));
+    }
+    ASSERT_EQ(0, DestructionTracked::alive);
+}
+
 TEST(MPSCQueueTest, mpsc_test_allocator) {
     butil::ObjectPoolAllocator<MyObject> alloc;
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to