Revert "asan_memory_profile: Fix for deadlock in memory profiler code."
authorVitaly Buka <vitalybuka@google.com>
Tue, 4 Apr 2023 03:42:16 +0000 (20:42 -0700)
committerVitaly Buka <vitalybuka@google.com>
Tue, 4 Apr 2023 05:59:02 +0000 (22:59 -0700)
Deadlocks with internal symbolizer.
https://lab.llvm.org/buildbot/#/builders/37/builds/21181

This reverts commit 129394ff50ed28a0b85d742c8ae315758bb22582.

compiler-rt/lib/asan/asan_memory_profile.cpp

index f41d8e1..6c2b740 100644 (file)
 // This file implements __sanitizer_print_memory_profile.
 //===----------------------------------------------------------------------===//
 
-#include "asan/asan_allocator.h"
-#include "lsan/lsan_common.h"
 #include "sanitizer_common/sanitizer_common.h"
-#include "sanitizer_common/sanitizer_platform.h"
 #include "sanitizer_common/sanitizer_stackdepot.h"
 #include "sanitizer_common/sanitizer_stacktrace.h"
 #include "sanitizer_common/sanitizer_stoptheworld.h"
+#include "lsan/lsan_common.h"
+#include "asan/asan_allocator.h"
 
 #if CAN_SANITIZE_LEAKS
-#  if SANITIZER_LINUX || SANITIZER_NETBSD
-#    include <link.h>
-#  endif
 
 namespace __asan {
 
@@ -115,42 +111,8 @@ static void MemoryProfileCB(const SuspendedThreadsList &suspended_threads_list,
     __asan_print_accumulated_stats();
 }
 
-struct DoStopTheWorldParam {
-  StopTheWorldCallback callback;
-  void *argument;
-};
-
-static void LockDefStuffAndStopTheWorld(DoStopTheWorldParam *param) {
-  __lsan::LockThreadRegistry();
-  __lsan::LockAllocator();
-  __sanitizer::StopTheWorld(param->callback, param->argument);
-  __lsan::UnlockAllocator();
-  __lsan::UnlockThreadRegistry();
-}
-
 #if SANITIZER_LINUX || SANITIZER_NETBSD
-static int LockStuffAndStopTheWorldCallback(struct dl_phdr_info *info,
-                                            size_t size, void *data) {
-  DoStopTheWorldParam *param = reinterpret_cast<DoStopTheWorldParam *>(data);
-  LockDefStuffAndStopTheWorld(param);
-  return 1;
-}
 #endif
-
-static void LockStuffAndStopTheWorld(StopTheWorldCallback callback,
-                                     void *argument) {
-  DoStopTheWorldParam param = {callback, argument};
-
-#  if SANITIZER_LINUX || SANITIZER_NETBSD
-  // For libc dep systems, symbolization uses dl_iterate_phdr, which acquire a
-  // dl write lock. It could deadlock if the lock is already acquired by one of
-  // suspended. So calling stopTheWorld inside dl_iterate_phdr, first wait for
-  // that lock to be released (if acquired) and than suspend all threads
-  dl_iterate_phdr(LockStuffAndStopTheWorldCallback, &param);
-#  else
-  LockDefStuffAndStopTheWorld(&param);
-#  endif
-}
 }  // namespace __asan
 
 #endif  // CAN_SANITIZE_LEAKS
@@ -163,7 +125,7 @@ void __sanitizer_print_memory_profile(uptr top_percent,
   uptr Arg[2];
   Arg[0] = top_percent;
   Arg[1] = max_number_of_contexts;
-  __asan::LockStuffAndStopTheWorld(__asan::MemoryProfileCB, Arg);
+  __sanitizer::StopTheWorld(__asan::MemoryProfileCB, Arg);
 #endif  // CAN_SANITIZE_LEAKS
 }
 }  // extern "C"