156f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev//=-- lsan_thread.h -------------------------------------------------------===//
256f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev//
356f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev//                     The LLVM Compiler Infrastructure
456f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev//
556f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev// This file is distributed under the University of Illinois Open Source
656f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev// License. See LICENSE.TXT for details.
756f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev//
856f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev//===----------------------------------------------------------------------===//
956f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev//
1056f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev// This file is a part of LeakSanitizer.
1156f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev// Thread registry for standalone LSan.
1256f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev//
1356f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev//===----------------------------------------------------------------------===//
1456f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev
1556f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev#ifndef LSAN_THREAD_H
1656f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev#define LSAN_THREAD_H
1756f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev
1856f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev#include "sanitizer_common/sanitizer_thread_registry.h"
1956f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev
2056f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveevnamespace __lsan {
2156f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev
2256f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveevclass ThreadContext : public ThreadContextBase {
2356f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev public:
2456f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev  explicit ThreadContext(int tid);
2556f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev  void OnStarted(void *arg);
2656f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev  void OnFinished();
2756f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev  uptr stack_begin() { return stack_begin_; }
2856f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev  uptr stack_end() { return stack_end_; }
2956f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev  uptr tls_begin() { return tls_begin_; }
3056f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev  uptr tls_end() { return tls_end_; }
3156f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev  uptr cache_begin() { return cache_begin_; }
3256f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev  uptr cache_end() { return cache_end_; }
3356f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev private:
3456f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev  uptr stack_begin_, stack_end_,
3556f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev       cache_begin_, cache_end_,
3656f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev       tls_begin_, tls_end_;
3756f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev};
3856f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev
3956f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveevvoid InitializeThreadRegistry();
4056f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev
4156f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveevvoid ThreadStart(u32 tid, uptr os_id);
4256f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveevvoid ThreadFinish();
4356f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveevu32 ThreadCreate(u32 tid, uptr uid, bool detached);
4456f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveevvoid ThreadJoin(u32 tid);
4556f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveevu32 ThreadTid(uptr uid);
4656f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev
4756f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveevu32 GetCurrentThread();
4856f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveevvoid SetCurrentThread(u32 tid);
4956f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey MatveevThreadContext *CurrentThreadContext();
50c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveevvoid EnsureMainThreadIDIsCorrect();
5156f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev}  // namespace __lsan
5256f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev
5356f77a7570d96aa4c6afb7ab26e58925b2506f86Sergey Matveev#endif  // LSAN_THREAD_H
54