xref: /openbsd-src/gnu/llvm/compiler-rt/lib/lsan/lsan_thread.h (revision 810390e339a5425391477d5d41c78d7cab2424ac)
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