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