This is an automated email from the ASF dual-hosted git repository.
guangmingchen 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 b4d4acb7 [MPSQ] fix a memleak in butil::ObjectPoolAllocator (#2725)
b4d4acb7 is described below
commit b4d4acb7cd9a677039f662f18df37d4be7172ed3
Author: David Lee <[email protected]>
AuthorDate: Tue Aug 6 14:26:55 2024 +0800
[MPSQ] fix a memleak in butil::ObjectPoolAllocator (#2725)
Without specifying the type of the pointer, the memory will return to
the pool holding all `void' pointers.
Signed-off-by: Qun, Li <[email protected]>
---
src/butil/containers/mpsc_queue.h | 2 +-
test/mpsc_queue_unittest.cc | 22 +++++++++++++++++++++-
2 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/src/butil/containers/mpsc_queue.h
b/src/butil/containers/mpsc_queue.h
index 45ab2ebe..f9e1d780 100644
--- a/src/butil/containers/mpsc_queue.h
+++ b/src/butil/containers/mpsc_queue.h
@@ -52,7 +52,7 @@ template <typename T>
class ObjectPoolAllocator {
public:
void* Alloc() { return get_object<MPSCQueueNode<T>>(); }
- void Free(void* p) { return_object(p); }
+ void Free(void* p) { return_object(static_cast<MPSCQueueNode<T>*>(p)); }
};
diff --git a/test/mpsc_queue_unittest.cc b/test/mpsc_queue_unittest.cc
index bd152a5d..f57a85f6 100644
--- a/test/mpsc_queue_unittest.cc
+++ b/test/mpsc_queue_unittest.cc
@@ -2,6 +2,9 @@
#include <pthread.h>
#include "butil/containers/mpsc_queue.h"
+#define BAIDU_CLEAR_OBJECT_POOL_AFTER_ALL_THREADS_QUIT
+#include "butil/object_pool.h"
+
namespace {
const uint MAX_COUNT = 1000000;
@@ -120,5 +123,22 @@ TEST(MPSCQueueTest, mpsc_multi_thread) {
}
+struct MyObject {};
+
+TEST(MPSCQueueTest, mpsc_test_allocator) {
+ butil::ObjectPoolAllocator<MyObject> alloc;
+
+ auto p = alloc.Alloc();
+ butil::ObjectPoolInfo info =
butil::describe_objects<butil::MPSCQueueNode<MyObject>>();
+ ASSERT_EQ(1, info.item_num);
+
+ alloc.Free(p);
+ info = butil::describe_objects<butil::MPSCQueueNode<MyObject>>();
+ ASSERT_EQ(1, info.item_num);
-}
\ No newline at end of file
+ p = alloc.Alloc();
+ info = butil::describe_objects<butil::MPSCQueueNode<MyObject>>();
+ ASSERT_EQ(1, info.item_num);
+}
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]