This is an automated email from the ASF dual-hosted git repository.
wwbmmm 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 6b29a365 Instruct LeakSanitizer to ignore designated memory leaks of
Server and Singleton (#2858)
6b29a365 is described below
commit 6b29a365a82cd66083cd6ef3b91abf79974e0ca8
Author: Bright Chen <[email protected]>
AuthorDate: Mon Jan 6 14:41:59 2025 +0800
Instruct LeakSanitizer to ignore designated memory leaks of Server and
Singleton (#2858)
* Instruct LeakSanitizer to ignore designated memory leaks of Server and
Singleton
* Remove the redundant line
---
src/brpc/server.cpp | 11 ++++++++---
src/butil/compiler_specific.h | 13 +++++++++++++
src/butil/debug/leak_annotations.h | 2 +-
src/butil/lazy_instance.h | 1 +
src/butil/memory/singleton.h | 11 +++++++++--
5 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/src/brpc/server.cpp b/src/brpc/server.cpp
index 9ab79fc3..ade8e274 100644
--- a/src/brpc/server.cpp
+++ b/src/brpc/server.cpp
@@ -24,12 +24,13 @@
#include <google/protobuf/descriptor.h> // ServiceDescriptor
#include "idl_options.pb.h" // option(idl_support)
#include "bthread/unstable.h" //
bthread_keytable_pool_init
-#include "butil/macros.h" // ARRAY_SIZE
-#include "butil/fd_guard.h" // fd_guard
-#include "butil/logging.h" // CHECK
+#include "butil/macros.h" // ARRAY_SIZE
+#include "butil/fd_guard.h" // fd_guard
+#include "butil/logging.h" // CHECK
#include "butil/time.h"
#include "butil/class_name.h"
#include "butil/string_printf.h"
+#include "butil/debug/leak_annotations.h"
#include "brpc/log.h"
#include "brpc/compress.h"
#include "brpc/policy/nova_pbrpc_protocol.h"
@@ -885,6 +886,10 @@ int Server::StartInternal(const butil::EndPoint& endpoint,
_session_local_data_pool->Reserve(_options.reserved_session_local_data);
}
+ // Leak of `_keytable_pool' and others is by design.
+ // See comments in Server::Join() for details.
+ // Instruct LeakSanitizer to ignore the designated memory leak.
+ ANNOTATE_SCOPED_MEMORY_LEAK;
// Init _keytable_pool always. If the server was stopped before, the pool
// should be destroyed in Join().
_keytable_pool = new bthread_keytable_pool_t;
diff --git a/src/butil/compiler_specific.h b/src/butil/compiler_specific.h
index 9eb4283e..924fe439 100644
--- a/src/butil/compiler_specific.h
+++ b/src/butil/compiler_specific.h
@@ -199,6 +199,19 @@
#define WARN_UNUSED_RESULT
#endif
+// Compiler feature-detection.
+// clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension
+#if defined(__has_feature)
+#define BUTIL_HAS_FEATURE(FEATURE) __has_feature(FEATURE)
+#else
+#define BUTIL_HAS_FEATURE(FEATURE) 0
+#endif
+
+// Instruct ASan is enabled.
+#if BUTIL_HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
+#define BUTIL_USE_ASAN 1
+#endif
+
// Tell the compiler a function is using a printf-style format string.
// |format_param| is the one-based index of the format string parameter;
// |dots_param| is the one-based index of the "..." parameter.
diff --git a/src/butil/debug/leak_annotations.h
b/src/butil/debug/leak_annotations.h
index aec55fe0..231e9982 100644
--- a/src/butil/debug/leak_annotations.h
+++ b/src/butil/debug/leak_annotations.h
@@ -19,7 +19,7 @@
// ANNOTATE_LEAKING_OBJECT_PTR(X): the heap object referenced by pointer X will
// be annotated as a leak.
-#if defined(LEAK_SANITIZER) && !defined(OS_NACL)
+#if (defined(LEAK_SANITIZER) && !defined(OS_NACL)) || defined(BUTIL_USE_ASAN)
// Public LSan API from <sanitizer/lsan_interface.h>.
extern "C" {
diff --git a/src/butil/lazy_instance.h b/src/butil/lazy_instance.h
index 38b48a87..e1daeb58 100644
--- a/src/butil/lazy_instance.h
+++ b/src/butil/lazy_instance.h
@@ -105,6 +105,7 @@ struct LeakyLazyInstanceTraits {
#endif
static Type* New(void* instance) {
+ // Instruct LeakSanitizer to ignore the designated memory leak.
ANNOTATE_SCOPED_MEMORY_LEAK;
return DefaultLazyInstanceTraits<Type>::New(instance);
}
diff --git a/src/butil/memory/singleton.h b/src/butil/memory/singleton.h
index 51ce5254..f76a8317 100644
--- a/src/butil/memory/singleton.h
+++ b/src/butil/memory/singleton.h
@@ -25,6 +25,7 @@
#include "butil/memory/aligned_memory.h"
#include "butil/third_party/dynamic_annotations/dynamic_annotations.h"
#include "butil/threading/thread_restrictions.h"
+#include "butil/debug/leak_annotations.h"
namespace butil {
namespace internal {
@@ -266,8 +267,14 @@ class Singleton {
butil::subtle::Release_Store(
&instance_, reinterpret_cast<butil::subtle::AtomicWord>(newval));
- if (newval != NULL && Traits::kRegisterAtExit)
- butil::AtExitManager::RegisterCallback(OnExit, NULL);
+ if (newval != NULL) {
+ if (Traits::kRegisterAtExit) {
+ butil::AtExitManager::RegisterCallback(OnExit, NULL);
+ } else {
+ // Instruct LeakSanitizer to ignore the designated memory leak.
+ ANNOTATE_LEAKING_OBJECT_PTR(newval);
+ }
+ }
return newval;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]