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]