From 0d846d206e709797a8bbe65ec648878dc2853434 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Tue, 16 May 2023 10:41:14 -0700 Subject: Revert "[NFC][LSAN] Move ThreadCreate into child thread" https://bugs.chromium.org/p/chromium/issues/detail?id=1445676 This reverts commit 6d7b26ae49b9273d9aea4e53a96901caeb09efe0. --- compiler-rt/lib/lsan/lsan_interceptors.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) (limited to 'compiler-rt') diff --git a/compiler-rt/lib/lsan/lsan_interceptors.cpp b/compiler-rt/lib/lsan/lsan_interceptors.cpp index 2a35572edfec..4be34db28c77 100644 --- a/compiler-rt/lib/lsan/lsan_interceptors.cpp +++ b/compiler-rt/lib/lsan/lsan_interceptors.cpp @@ -415,10 +415,8 @@ INTERCEPTOR(char *, strerror, int errnum) { #if SANITIZER_POSIX -template -static void *ThreadStartFunc(void *arg) { - u32 parent_tid = (uptr)arg; - uptr tid = ThreadCreate(parent_tid, Detached); +extern "C" void *__lsan_thread_start_func(void *arg) { + atomic_uintptr_t *atomic_tid = (atomic_uintptr_t *)arg; // Wait until the last iteration to maximize the chance that we are the last // destructor to run. #if !SANITIZER_NETBSD && !SANITIZER_FREEBSD @@ -427,8 +425,12 @@ static void *ThreadStartFunc(void *arg) { Report("LeakSanitizer: failed to set thread key.\n"); Die(); } -# endif +#endif + int tid = 0; + while ((tid = atomic_load(atomic_tid, memory_order_acquire)) == 0) + internal_sched_yield(); ThreadStart(tid, GetTid()); + atomic_store(atomic_tid, 0, memory_order_release); auto self = GetThreadSelf(); auto args = GetThreadArgRetval().GetArgs(self); void *retval = (*args.routine)(args.arg_retval); @@ -448,7 +450,7 @@ INTERCEPTOR(int, pthread_create, void *th, void *attr, AdjustStackSize(attr); int detached = 0; pthread_attr_getdetachstate(attr, &detached); - uptr this_tid = GetCurrentThreadId(); + atomic_uintptr_t atomic_tid = {}; int result; { // Ignore all allocations made by pthread_create: thread stack/TLS may be @@ -457,14 +459,18 @@ INTERCEPTOR(int, pthread_create, void *th, void *attr, // objects, the latter are calculated by obscure pointer arithmetic. ScopedInterceptorDisabler disabler; GetThreadArgRetval().Create(detached, {callback, param}, [&]() -> uptr { - result = REAL(pthread_create)(th, attr, - IsStateDetached(detached) - ? ThreadStartFunc - : ThreadStartFunc, - (void *)this_tid); + result = + REAL(pthread_create)(th, attr, __lsan_thread_start_func, &atomic_tid); return result ? 0 : *(uptr *)(th); }); } + if (result == 0) { + int tid = ThreadCreate(GetCurrentThreadId(), IsStateDetached(detached)); + CHECK_NE(tid, kMainTid); + atomic_store(&atomic_tid, tid, memory_order_release); + while (atomic_load(&atomic_tid, memory_order_acquire) != 0) + internal_sched_yield(); + } if (attr == &myattr) pthread_attr_destroy(&myattr); return result; -- cgit v1.2.1