diff options
author | nkozlovskiy <nmk@ydb.tech> | 2023-10-11 19:11:46 +0300 |
---|---|---|
committer | nkozlovskiy <nmk@ydb.tech> | 2023-10-11 19:33:28 +0300 |
commit | 61b3971447e473726d6cdb23fc298e457b4d973c (patch) | |
tree | e2a2a864bb7717f7ae6138f6a3194a254dd2c7bb /contrib/libs/clang14-rt/lib/lsan/lsan_thread.cpp | |
parent | a674dc57d88d43c2e8e90a6084d5d2c988e0402c (diff) | |
download | ydb-61b3971447e473726d6cdb23fc298e457b4d973c.tar.gz |
add sanitizers dependencies
Diffstat (limited to 'contrib/libs/clang14-rt/lib/lsan/lsan_thread.cpp')
-rw-r--r-- | contrib/libs/clang14-rt/lib/lsan/lsan_thread.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/contrib/libs/clang14-rt/lib/lsan/lsan_thread.cpp b/contrib/libs/clang14-rt/lib/lsan/lsan_thread.cpp new file mode 100644 index 0000000000..ca3dfd03b1 --- /dev/null +++ b/contrib/libs/clang14-rt/lib/lsan/lsan_thread.cpp @@ -0,0 +1,90 @@ +//=-- lsan_thread.cpp -----------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of LeakSanitizer. +// See lsan_thread.h for details. +// +//===----------------------------------------------------------------------===// + +#include "lsan_thread.h" + +#include "lsan.h" +#include "lsan_allocator.h" +#include "lsan_common.h" +#include "sanitizer_common/sanitizer_common.h" +#include "sanitizer_common/sanitizer_placement_new.h" +#include "sanitizer_common/sanitizer_thread_registry.h" +#include "sanitizer_common/sanitizer_tls_get_addr.h" + +namespace __lsan { + +static ThreadRegistry *thread_registry; + +static ThreadContextBase *CreateThreadContext(u32 tid) { + void *mem = MmapOrDie(sizeof(ThreadContext), "ThreadContext"); + return new (mem) ThreadContext(tid); +} + +void InitializeThreadRegistry() { + static ALIGNED(64) char thread_registry_placeholder[sizeof(ThreadRegistry)]; + thread_registry = + new (thread_registry_placeholder) ThreadRegistry(CreateThreadContext); +} + +ThreadContextLsanBase::ThreadContextLsanBase(int tid) + : ThreadContextBase(tid) {} + +void ThreadContextLsanBase::OnFinished() { + AllocatorThreadFinish(); + DTLS_Destroy(); +} + +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, + ThreadType thread_type, void *arg) { + thread_registry->StartThread(tid, os_id, thread_type, arg); + SetCurrentThread(tid); +} + +void ThreadFinish() { + thread_registry->FinishThread(GetCurrentThread()); + SetCurrentThread(kInvalidTid); +} + +ThreadContext *CurrentThreadContext() { + if (!thread_registry) + return nullptr; + if (GetCurrentThread() == kInvalidTid) + return nullptr; + // No lock needed when getting current thread. + return (ThreadContext *)thread_registry->GetThreadLocked(GetCurrentThread()); +} + +void EnsureMainThreadIDIsCorrect() { + if (GetCurrentThread() == kMainTid) + CurrentThreadContext()->os_id = GetTid(); +} + +///// Interface to the common LSan module. ///// + +void ForEachExtraStackRange(tid_t os_id, RangeIteratorCallback callback, + void *arg) {} + +void LockThreadRegistry() { thread_registry->Lock(); } + +void UnlockThreadRegistry() { thread_registry->Unlock(); } + +ThreadRegistry *GetThreadRegistryLocked() { + thread_registry->CheckLocked(); + return thread_registry; +} + +} // namespace __lsan |