123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #include "sanitizers.h"
- #include "thread.h"
- using namespace NSan;
- #if defined(_tsan_enabled_)
- #if defined(__clang_major__) && (__clang_major__ >= 9)
- extern "C" { // sanitizers API
- #if defined(_tsan_enabled_)
- void* __tsan_create_fiber(unsigned flags);
- void __tsan_set_fiber_name(void* fiber, const char* name);
- #endif
- } // sanitizers API
- #else
- namespace {
- void* __tsan_create_fiber(unsigned) {
- return nullptr;
- }
- void __tsan_set_fiber_name(void*, const char*) {
- }
- } // namespace
- #endif
- #endif
- TFiberContext::TFiberContext() noexcept
- : Token_(nullptr)
- , IsMainFiber_(true)
- #if defined(_tsan_enabled_)
- , CurrentTSanFiberContext_(__tsan_get_current_fiber())
- #endif
- {
- TCurrentThreadLimits sl;
- (void)Token_;
- Stack_ = sl.StackBegin;
- Len_ = sl.StackLength;
- #if defined(_tsan_enabled_)
- static constexpr char MainFiberName[] = "main_fiber";
- __tsan_set_fiber_name(CurrentTSanFiberContext_, MainFiberName);
- #endif
- }
- TFiberContext::TFiberContext(const void* stack, size_t len, const char* contName) noexcept
- : Token_(nullptr)
- , Stack_(stack)
- , Len_(len)
- , IsMainFiber_(false)
- #if defined(_tsan_enabled_)
- , CurrentTSanFiberContext_(__tsan_create_fiber(/*flags =*/0))
- #endif
- {
- (void)contName;
- #if defined(_tsan_enabled_)
- __tsan_set_fiber_name(CurrentTSanFiberContext_, contName);
- #endif
- }
- #if defined(_tsan_enabled_)
- extern "C" {
- // This function should not be directly exposed in headers
- // due to signature variations among contrib headers.
- void AnnotateBenignRaceSized(const char* file, int line,
- const volatile void* address,
- size_t size,
- const char* description);
- }
- void NSan::AnnotateBenignRaceSized(const char* file, int line,
- const volatile void* address,
- size_t size,
- const char* description) noexcept {
- ::AnnotateBenignRaceSized(file, line, address, size, description);
- }
- #endif
|