diff options
Diffstat (limited to 'lib/lsan/lsan.cc')
-rw-r--r-- | lib/lsan/lsan.cc | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/lib/lsan/lsan.cc b/lib/lsan/lsan.cc index 9b83b411f843..058bbdba3907 100644 --- a/lib/lsan/lsan.cc +++ b/lib/lsan/lsan.cc @@ -20,25 +20,30 @@ #include "lsan_common.h" #include "lsan_thread.h" +bool lsan_inited; +bool lsan_init_is_running; + namespace __lsan { static void InitializeCommonFlags() { CommonFlags *cf = common_flags(); + SetCommonFlagDefaults(); cf->external_symbolizer_path = GetEnv("LSAN_SYMBOLIZER_PATH"); - cf->symbolize = (cf->external_symbolizer_path && - cf->external_symbolizer_path[0]); - cf->strip_path_prefix = ""; - cf->fast_unwind_on_malloc = true; cf->malloc_context_size = 30; + cf->detect_leaks = true; ParseCommonFlagsFromString(GetEnv("LSAN_OPTIONS")); } -void Init() { - static bool inited; - if (inited) +} // namespace __lsan + +using namespace __lsan; // NOLINT + +extern "C" void __lsan_init() { + CHECK(!lsan_init_is_running); + if (lsan_inited) return; - inited = true; + lsan_init_is_running = true; SanitizerToolName = "LeakSanitizer"; InitializeCommonFlags(); InitializeAllocator(); @@ -48,16 +53,19 @@ void Init() { u32 tid = ThreadCreate(0, 0, true); CHECK_EQ(tid, 0); ThreadStart(tid, GetTid()); + SetCurrentThread(tid); // Start symbolizer process if necessary. - const char* external_symbolizer = common_flags()->external_symbolizer_path; - if (common_flags()->symbolize && external_symbolizer && - external_symbolizer[0]) { - InitializeExternalSymbolizer(external_symbolizer); + if (common_flags()->symbolize) { + Symbolizer::Init(common_flags()->external_symbolizer_path); + } else { + Symbolizer::Disable(); } InitCommonLsan(); - Atexit(DoLeakCheck); + if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit) + Atexit(DoLeakCheck); + lsan_inited = true; + lsan_init_is_running = false; } -} // namespace __lsan |