forked from OSchip/llvm-project
lsan: remove pthread_detach/join interceptors
They don't seem to do anything useful in lsan. They are needed only if a tools needs to execute some custom logic during detach/join, or if it uses thread registry quarantine. Lsan does none of this. And if a tool cares then it would also need to intercept pthread_tryjoin_np and pthread_timedjoin_np, otherwise it will mess thread states. Fwiw, asan does not intercept these functions either. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D113920
This commit is contained in:
parent
a7c57c4ec8
commit
033b94ab52
|
@ -62,7 +62,7 @@ void InitializeMainThread() {
|
|||
OnCreatedArgs args;
|
||||
__sanitizer::GetThreadStackTopAndBottom(true, &args.stack_end,
|
||||
&args.stack_begin);
|
||||
u32 tid = ThreadCreate(0, GetThreadSelf(), true, &args);
|
||||
u32 tid = ThreadCreate(kMainTid, true, &args);
|
||||
CHECK_EQ(tid, 0);
|
||||
ThreadStart(tid);
|
||||
}
|
||||
|
@ -86,14 +86,13 @@ void GetAllThreadAllocatorCachesLocked(InternalMmapVector<uptr> *caches) {
|
|||
void *__sanitizer_before_thread_create_hook(thrd_t thread, bool detached,
|
||||
const char *name, void *stack_base,
|
||||
size_t stack_size) {
|
||||
uptr user_id = reinterpret_cast<uptr>(thread);
|
||||
ENSURE_LSAN_INITED;
|
||||
EnsureMainThreadIDIsCorrect();
|
||||
OnCreatedArgs args;
|
||||
args.stack_begin = reinterpret_cast<uptr>(stack_base);
|
||||
args.stack_end = args.stack_begin + stack_size;
|
||||
u32 parent_tid = GetCurrentThread();
|
||||
u32 tid = ThreadCreate(parent_tid, user_id, detached, &args);
|
||||
u32 tid = ThreadCreate(parent_tid, detached, &args);
|
||||
return reinterpret_cast<void *>(static_cast<uptr>(tid));
|
||||
}
|
||||
|
||||
|
|
|
@ -468,8 +468,7 @@ INTERCEPTOR(int, pthread_create, void *th, void *attr,
|
|||
res = REAL(pthread_create)(th, attr, __lsan_thread_start_func, &p);
|
||||
}
|
||||
if (res == 0) {
|
||||
int tid = ThreadCreate(GetCurrentThread(), *(uptr *)th,
|
||||
IsStateDetached(detached));
|
||||
int tid = ThreadCreate(GetCurrentThread(), IsStateDetached(detached));
|
||||
CHECK_NE(tid, kMainTid);
|
||||
atomic_store(&p.tid, tid, memory_order_release);
|
||||
while (atomic_load(&p.tid, memory_order_acquire) != 0)
|
||||
|
@ -480,24 +479,6 @@ INTERCEPTOR(int, pthread_create, void *th, void *attr,
|
|||
return res;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, pthread_join, void *th, void **ret) {
|
||||
ENSURE_LSAN_INITED;
|
||||
int tid = ThreadTid((uptr)th);
|
||||
int res = REAL(pthread_join)(th, ret);
|
||||
if (res == 0)
|
||||
ThreadJoin(tid);
|
||||
return res;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, pthread_detach, void *th) {
|
||||
ENSURE_LSAN_INITED;
|
||||
int tid = ThreadTid((uptr)th);
|
||||
int res = REAL(pthread_detach)(th);
|
||||
if (res == 0)
|
||||
ThreadDetach(tid);
|
||||
return res;
|
||||
}
|
||||
|
||||
INTERCEPTOR(void, _exit, int status) {
|
||||
if (status == 0 && HasReportedLeaks()) status = common_flags()->exitcode;
|
||||
REAL(_exit)(status);
|
||||
|
@ -530,8 +511,6 @@ void InitializeInterceptors() {
|
|||
LSAN_MAYBE_INTERCEPT_MALLINFO;
|
||||
LSAN_MAYBE_INTERCEPT_MALLOPT;
|
||||
INTERCEPT_FUNCTION(pthread_create);
|
||||
INTERCEPT_FUNCTION(pthread_detach);
|
||||
INTERCEPT_FUNCTION(pthread_join);
|
||||
INTERCEPT_FUNCTION(_exit);
|
||||
|
||||
LSAN_MAYBE_INTERCEPT__LWP_EXIT;
|
||||
|
|
|
@ -68,7 +68,7 @@ typedef struct {
|
|||
ALWAYS_INLINE
|
||||
void lsan_register_worker_thread(int parent_tid) {
|
||||
if (GetCurrentThread() == kInvalidTid) {
|
||||
u32 tid = ThreadCreate(parent_tid, 0, true);
|
||||
u32 tid = ThreadCreate(parent_tid, true);
|
||||
ThreadStart(tid, GetTid());
|
||||
SetCurrentThread(tid);
|
||||
}
|
||||
|
|
|
@ -75,7 +75,7 @@ bool GetThreadRangesLocked(tid_t os_id, uptr *stack_begin, uptr *stack_end,
|
|||
}
|
||||
|
||||
void InitializeMainThread() {
|
||||
u32 tid = ThreadCreate(kMainTid, 0, true);
|
||||
u32 tid = ThreadCreate(kMainTid, true);
|
||||
CHECK_EQ(tid, kMainTid);
|
||||
ThreadStart(tid, GetTid());
|
||||
}
|
||||
|
|
|
@ -44,8 +44,8 @@ void ThreadContextLsanBase::OnFinished() {
|
|||
DTLS_Destroy();
|
||||
}
|
||||
|
||||
u32 ThreadCreate(u32 parent_tid, uptr user_id, bool detached, void *arg) {
|
||||
return thread_registry->CreateThread(user_id, detached, parent_tid, arg);
|
||||
u32 ThreadCreate(u32 parent_tid, bool detached, void *arg) {
|
||||
return thread_registry->CreateThread(0, detached, parent_tid, arg);
|
||||
}
|
||||
|
||||
void ThreadContextLsanBase::ThreadStart(u32 tid, tid_t os_id,
|
||||
|
@ -68,28 +68,6 @@ ThreadContext *CurrentThreadContext() {
|
|||
return (ThreadContext *)thread_registry->GetThreadLocked(GetCurrentThread());
|
||||
}
|
||||
|
||||
static bool FindThreadByUid(ThreadContextBase *tctx, void *arg) {
|
||||
uptr uid = (uptr)arg;
|
||||
if (tctx->user_id == uid && tctx->status != ThreadStatusInvalid) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
u32 ThreadTid(uptr uid) {
|
||||
return thread_registry->FindThread(FindThreadByUid, (void *)uid);
|
||||
}
|
||||
|
||||
void ThreadDetach(u32 tid) {
|
||||
CHECK_NE(tid, kInvalidTid);
|
||||
thread_registry->DetachThread(tid, /* arg */ nullptr);
|
||||
}
|
||||
|
||||
void ThreadJoin(u32 tid) {
|
||||
CHECK_NE(tid, kInvalidTid);
|
||||
thread_registry->JoinThread(tid, /* arg */ nullptr);
|
||||
}
|
||||
|
||||
void EnsureMainThreadIDIsCorrect() {
|
||||
if (GetCurrentThread() == kMainTid)
|
||||
CurrentThreadContext()->os_id = GetTid();
|
||||
|
|
|
@ -45,11 +45,8 @@ class ThreadContext;
|
|||
void InitializeThreadRegistry();
|
||||
void InitializeMainThread();
|
||||
|
||||
u32 ThreadCreate(u32 tid, uptr uid, bool detached, void *arg = nullptr);
|
||||
u32 ThreadCreate(u32 tid, bool detached, void *arg = nullptr);
|
||||
void ThreadFinish();
|
||||
void ThreadDetach(u32 tid);
|
||||
void ThreadJoin(u32 tid);
|
||||
u32 ThreadTid(uptr uid);
|
||||
|
||||
u32 GetCurrentThread();
|
||||
void SetCurrentThread(u32 tid);
|
||||
|
|
Loading…
Reference in New Issue