13cab2bb3Spatrick //=-- lsan_thread.h -------------------------------------------------------===// 23cab2bb3Spatrick // 33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63cab2bb3Spatrick // 73cab2bb3Spatrick //===----------------------------------------------------------------------===// 83cab2bb3Spatrick // 93cab2bb3Spatrick // This file is a part of LeakSanitizer. 103cab2bb3Spatrick // Thread registry for standalone LSan. 113cab2bb3Spatrick // 123cab2bb3Spatrick //===----------------------------------------------------------------------===// 133cab2bb3Spatrick 143cab2bb3Spatrick #ifndef LSAN_THREAD_H 153cab2bb3Spatrick #define LSAN_THREAD_H 163cab2bb3Spatrick 173cab2bb3Spatrick #include "sanitizer_common/sanitizer_thread_registry.h" 183cab2bb3Spatrick 193cab2bb3Spatrick namespace __lsan { 203cab2bb3Spatrick 211f9cb04fSpatrick class ThreadContextLsanBase : public ThreadContextBase { 223cab2bb3Spatrick public: 231f9cb04fSpatrick explicit ThreadContextLsanBase(int tid); 243cab2bb3Spatrick void OnFinished() override; stack_begin()253cab2bb3Spatrick uptr stack_begin() { return stack_begin_; } stack_end()263cab2bb3Spatrick uptr stack_end() { return stack_end_; } cache_begin()273cab2bb3Spatrick uptr cache_begin() { return cache_begin_; } cache_end()283cab2bb3Spatrick uptr cache_end() { return cache_end_; } 293cab2bb3Spatrick 301f9cb04fSpatrick // The argument is passed on to the subclass's OnStarted member function. 311f9cb04fSpatrick static void ThreadStart(u32 tid, tid_t os_id, ThreadType thread_type, 321f9cb04fSpatrick void *onstarted_arg); 331f9cb04fSpatrick 341f9cb04fSpatrick protected: ~ThreadContextLsanBase()35d89ec533Spatrick ~ThreadContextLsanBase() {} 361f9cb04fSpatrick uptr stack_begin_ = 0; 371f9cb04fSpatrick uptr stack_end_ = 0; 381f9cb04fSpatrick uptr cache_begin_ = 0; 391f9cb04fSpatrick uptr cache_end_ = 0; 403cab2bb3Spatrick }; 413cab2bb3Spatrick 421f9cb04fSpatrick // This subclass of ThreadContextLsanBase is declared in an OS-specific header. 431f9cb04fSpatrick class ThreadContext; 443cab2bb3Spatrick 451f9cb04fSpatrick void InitializeThreadRegistry(); 461f9cb04fSpatrick void InitializeMainThread(); 471f9cb04fSpatrick 48*810390e3Srobert ThreadRegistry *GetLsanThreadRegistryLocked(); 49*810390e3Srobert 50*810390e3Srobert u32 ThreadCreate(u32 tid, bool detached, void *arg = nullptr); 513cab2bb3Spatrick void ThreadFinish(); 523cab2bb3Spatrick 533cab2bb3Spatrick u32 GetCurrentThread(); 543cab2bb3Spatrick void SetCurrentThread(u32 tid); 553cab2bb3Spatrick ThreadContext *CurrentThreadContext(); 563cab2bb3Spatrick void EnsureMainThreadIDIsCorrect(); 571f9cb04fSpatrick 583cab2bb3Spatrick } // namespace __lsan 593cab2bb3Spatrick 603cab2bb3Spatrick #endif // LSAN_THREAD_H 61