1//=-- lsan_thread.h -------------------------------------------------------===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file is a part of LeakSanitizer. 10// Thread registry for standalone LSan. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LSAN_THREAD_H 15#define LSAN_THREAD_H 16 17#include "sanitizer_common/sanitizer_thread_arg_retval.h" 18#include "sanitizer_common/sanitizer_thread_registry.h" 19 20namespace __lsan { 21 22class ThreadContextLsanBase : public ThreadContextBase { 23 public: 24 explicit ThreadContextLsanBase(int tid); 25 void OnStarted(void *arg) override; 26 void OnFinished() override; 27 uptr stack_begin() { return stack_begin_; } 28 uptr stack_end() { return stack_end_; } 29 uptr cache_begin() { return cache_begin_; } 30 uptr cache_end() { return cache_end_; } 31 32 // The argument is passed on to the subclass's OnStarted member function. 33 static void ThreadStart(u32 tid, tid_t os_id, ThreadType thread_type, 34 void *onstarted_arg); 35 36 protected: 37 ~ThreadContextLsanBase() {} 38 uptr stack_begin_ = 0; 39 uptr stack_end_ = 0; 40 uptr cache_begin_ = 0; 41 uptr cache_end_ = 0; 42}; 43 44// This subclass of ThreadContextLsanBase is declared in an OS-specific header. 45class ThreadContext; 46 47void InitializeThreads(); 48void InitializeMainThread(); 49 50ThreadRegistry *GetLsanThreadRegistryLocked(); 51ThreadArgRetval &GetThreadArgRetval(); 52 53u32 ThreadCreate(u32 tid, bool detached, void *arg = nullptr); 54void ThreadFinish(); 55 56ThreadContextLsanBase *GetCurrentThread(); 57inline u32 GetCurrentThreadId() { 58 ThreadContextLsanBase *ctx = GetCurrentThread(); 59 return ctx ? ctx->tid : kInvalidTid; 60} 61void SetCurrentThread(ThreadContextLsanBase *tctx); 62void EnsureMainThreadIDIsCorrect(); 63 64} // namespace __lsan 65 66#endif // LSAN_THREAD_H 67