diff options
author | Vitaly Buka <vitalybuka@google.com> | 2023-05-08 14:57:03 -0700 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2023-05-11 16:18:52 -0700 |
commit | 6d7b26ae49b9273d9aea4e53a96901caeb09efe0 (patch) | |
tree | 5448cfbff3681e7949ddeeab5cbde82c61331f98 /compiler-rt | |
parent | 2eda2e013830537800b68c9217fc14ea7704e618 (diff) | |
download | llvm-6d7b26ae49b9273d9aea4e53a96901caeb09efe0.tar.gz |
[NFC][LSAN] Move ThreadCreate into child thread
Diffstat (limited to 'compiler-rt')
-rw-r--r-- | compiler-rt/lib/lsan/lsan_interceptors.cpp | 28 |
1 files changed, 11 insertions, 17 deletions
diff --git a/compiler-rt/lib/lsan/lsan_interceptors.cpp b/compiler-rt/lib/lsan/lsan_interceptors.cpp index 4be34db28c77..2a35572edfec 100644 --- a/compiler-rt/lib/lsan/lsan_interceptors.cpp +++ b/compiler-rt/lib/lsan/lsan_interceptors.cpp @@ -415,8 +415,10 @@ INTERCEPTOR(char *, strerror, int errnum) { #if SANITIZER_POSIX -extern "C" void *__lsan_thread_start_func(void *arg) { - atomic_uintptr_t *atomic_tid = (atomic_uintptr_t *)arg; +template <bool Detached> +static void *ThreadStartFunc(void *arg) { + u32 parent_tid = (uptr)arg; + uptr tid = ThreadCreate(parent_tid, Detached); // Wait until the last iteration to maximize the chance that we are the last // destructor to run. #if !SANITIZER_NETBSD && !SANITIZER_FREEBSD @@ -425,12 +427,8 @@ extern "C" void *__lsan_thread_start_func(void *arg) { Report("LeakSanitizer: failed to set thread key.\n"); Die(); } -#endif - int tid = 0; - while ((tid = atomic_load(atomic_tid, memory_order_acquire)) == 0) - internal_sched_yield(); +# endif 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); @@ -450,7 +448,7 @@ INTERCEPTOR(int, pthread_create, void *th, void *attr, AdjustStackSize(attr); int detached = 0; pthread_attr_getdetachstate(attr, &detached); - atomic_uintptr_t atomic_tid = {}; + uptr this_tid = GetCurrentThreadId(); int result; { // Ignore all allocations made by pthread_create: thread stack/TLS may be @@ -459,18 +457,14 @@ 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, __lsan_thread_start_func, &atomic_tid); + result = REAL(pthread_create)(th, attr, + IsStateDetached(detached) + ? ThreadStartFunc<true> + : ThreadStartFunc<false>, + (void *)this_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; |