diff options
author | arkady-e1ppa <arkady-e1ppa@yandex-team.com> | 2024-02-19 19:35:17 +0300 |
---|---|---|
committer | arkady-e1ppa <arkady-e1ppa@yandex-team.com> | 2024-02-19 19:51:51 +0300 |
commit | 04787c119a2f5c2f2e588b7c5bb9f206308ffe9e (patch) | |
tree | a414d0e7e1e0b9f2cff7c580f6a6747c3b27a805 | |
parent | 9f3835bead79ece9b35a76af38ec5b339779ada8 (diff) | |
download | ydb-04787c119a2f5c2f2e588b7c5bb9f206308ffe9e.tar.gz |
YT-21001: FiberContext::BeforeSwitch is now properly inlined
Improve annotations
5bd824bae00ce17bf4db9b1181455252e94f0b9f
-rw-r--r-- | util/system/context.cpp | 13 | ||||
-rw-r--r-- | util/system/context.h | 25 | ||||
-rw-r--r-- | util/system/sanitizers.cpp | 83 | ||||
-rw-r--r-- | util/system/sanitizers.h | 44 |
4 files changed, 70 insertions, 95 deletions
diff --git a/util/system/context.cpp b/util/system/context.cpp index ad993090884..3a67593813e 100644 --- a/util/system/context.cpp +++ b/util/system/context.cpp @@ -134,6 +134,8 @@ namespace { #endif } + #if defined(USE_SANITIZER_CONTEXT) + TContMachineContext::TSan::TSan() noexcept : TL(nullptr) { @@ -148,11 +150,12 @@ TContMachineContext::TSan::TSan(const TContClosure& c) noexcept void TContMachineContext::TSan::DoRunNaked() { AfterSwitch(); TL->DoRunNaked(); - BeforeFinish(); } + #endif + TContMachineContext::TContMachineContext(const TContClosure& c) - #if defined(_asan_enabled_) || defined(_tsan_enabled_) + #if defined(USE_SANITIZER_CONTEXT) : San_(c) #endif { @@ -162,7 +165,7 @@ TContMachineContext::TContMachineContext(const TContClosure& c) * arg, and align data */ - #if defined(_asan_enabled_) + #if defined(USE_SANITIZER_CONTEXT) auto trampoline = &San_; #else auto trampoline = c.TrampoLine; @@ -196,12 +199,12 @@ TContMachineContext::TContMachineContext(const TContClosure& c) void TContMachineContext::SwitchTo(TContMachineContext* next) noexcept { if (Y_LIKELY(__mysetjmp(Buf_) == 0)) { - #if defined(_asan_enabled_) || defined(_tsan_enabled_) + #if defined(USE_SANITIZER_CONTEXT) next->San_.BeforeSwitch(&San_); #endif __mylongjmp(next->Buf_, 1); } else { - #if defined(_asan_enabled_) + #if defined(USE_SANITIZER_CONTEXT) San_.AfterSwitch(); #endif } diff --git a/util/system/context.h b/util/system/context.h index c04a462365a..1b690bd57c7 100644 --- a/util/system/context.h +++ b/util/system/context.h @@ -3,7 +3,6 @@ #include "align.h" #include "defaults.h" #include "compiler.h" -#include "sanitizers.h" #include <util/generic/array_ref.h> #include <util/generic/utility.h> @@ -17,17 +16,21 @@ #error todo #endif +#if defined(__clang_major__) && (__clang_major__ >= 9) && (defined(_asan_enabled_) || defined(_tsan_enabled_)) + #include "sanitizers.h" + #define USE_SANITIZER_CONTEXT +#endif + /* * switch method */ -#if defined(thread_sanitizer_enabled) - #define USE_UCONTEXT_CONT - #if defined(_darwin_) - #define _XOPEN_SOURCE 700 - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - #endif -#elif defined(_bionic_) || defined(__IOS__) +#if defined(thread_sanitizer_enabled) && defined(_darwin_) + #define _XOPEN_SOURCE 700 + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + +#if defined(_bionic_) || defined(__IOS__) #define USE_GENERIC_CONT #elif defined(_cygwin_) #define USE_UCONTEXT_CONT @@ -145,6 +148,8 @@ public: private: __myjmp_buf Buf_; + #if defined(USE_SANITIZER_CONTEXT) + struct TSan: public ITrampoLine, public ::NSan::TFiberContext { TSan() noexcept; TSan(const TContClosure& c) noexcept; @@ -154,7 +159,6 @@ private: ITrampoLine* TL; }; - #if defined(_asan_enabled_) || defined(_tsan_enabled_) TSan San_; #endif }; @@ -168,6 +172,7 @@ static inline size_t MachineContextSize() noexcept { * be polite */ #if !defined(FROM_CONTEXT_IMPL) + #undef USE_SANITIZER_CONTEXT #undef USE_JUMP_CONT #undef USE_FIBER_CONT #undef USE_GENERIC_CONT diff --git a/util/system/sanitizers.cpp b/util/system/sanitizers.cpp index bb799a9e2e7..3e710b39c7b 100644 --- a/util/system/sanitizers.cpp +++ b/util/system/sanitizers.cpp @@ -1,42 +1,29 @@ #include "sanitizers.h" #include "thread.h" -#if defined(_asan_enabled_) -extern "C" { - void __sanitizer_start_switch_fiber(void** fake_stack_save, const void* bottom, size_t size); - void __sanitizer_finish_switch_fiber(void* fake_stack_save, const void** old_bottom, size_t* old_size); -} -#endif +using namespace NSan; #if defined(_tsan_enabled_) #if defined(__clang_major__) && (__clang_major__ >= 9) -extern "C" { - void* __tsan_get_current_fiber(void); +extern "C" { // sanitizers API + + #if defined(_tsan_enabled_) void* __tsan_create_fiber(unsigned flags); - void __tsan_destroy_fiber(void* fiber); - void __tsan_switch_to_fiber(void* fiber, unsigned flags); void __tsan_set_fiber_name(void* fiber, const char* name); -} + #endif + +} // sanitizers API #else namespace { - void* __tsan_get_current_fiber(void) { - return nullptr; - } void* __tsan_create_fiber(unsigned) { return nullptr; } - void __tsan_destroy_fiber(void*) { - } - void __tsan_switch_to_fiber(void*, unsigned) { - } void __tsan_set_fiber_name(void*, const char*) { } } #endif #endif -using namespace NSan; - TFiberContext::TFiberContext() noexcept : Token_(nullptr) , IsMainFiber_(true) @@ -45,7 +32,7 @@ TFiberContext::TFiberContext() noexcept #endif { TCurrentThreadLimits sl; - + (void)Token_; Stack_ = sl.StackBegin; Len_ = sl.StackLength; @@ -70,60 +57,6 @@ TFiberContext::TFiberContext(const void* stack, size_t len, const char* contName #endif } -TFiberContext::~TFiberContext() noexcept { - if (!IsMainFiber_) { -#if defined(_asan_enabled_) - if (Token_) { - // destroy saved FakeStack - void* activeFakeStack = nullptr; - const void* activeStack = nullptr; - size_t activeStackSize = 0; - __sanitizer_start_switch_fiber(&activeFakeStack, (char*)Stack_, Len_); - __sanitizer_finish_switch_fiber(Token_, &activeStack, &activeStackSize); - __sanitizer_start_switch_fiber(nullptr, activeStack, activeStackSize); - __sanitizer_finish_switch_fiber(activeFakeStack, nullptr, nullptr); - } -#endif -#if defined(_tsan_enabled_) - __tsan_destroy_fiber(CurrentTSanFiberContext_); -#endif - } -} - -void TFiberContext::BeforeFinish() noexcept { -#if defined(_asan_enabled_) - __sanitizer_start_switch_fiber(nullptr, nullptr, 0); -#else - (void)Token_; - (void)Stack_; - (void)Len_; -#endif -} - -void TFiberContext::BeforeSwitch(TFiberContext* old) noexcept { -#if defined(_asan_enabled_) - __sanitizer_start_switch_fiber(old ? &old->Token_ : nullptr, (char*)Stack_, Len_); -#else - (void)old; -#endif - -#if defined(_tsan_enabled_) - __tsan_switch_to_fiber(CurrentTSanFiberContext_, /*flags =*/0); -#endif -} - -void TFiberContext::AfterSwitch() noexcept { -#if defined(_asan_enabled_) - __sanitizer_finish_switch_fiber(Token_, nullptr, nullptr); -#endif -} - -void TFiberContext::AfterStart() noexcept { -#if defined(_asan_enabled_) - __sanitizer_finish_switch_fiber(nullptr, nullptr, nullptr); -#endif -} - #if defined(_tsan_enabled_) extern "C" { // This function should not be directly exposed in headers diff --git a/util/system/sanitizers.h b/util/system/sanitizers.h index f0d31244966..516256ea1d6 100644 --- a/util/system/sanitizers.h +++ b/util/system/sanitizers.h @@ -6,6 +6,8 @@ extern "C" { // sanitizers API #if defined(_asan_enabled_) void __lsan_ignore_object(const void* p); + void __sanitizer_start_switch_fiber(void** fake_stack_save, const void* bottom, size_t size); + void __sanitizer_finish_switch_fiber(void* fake_stack_save, const void** old_bottom, size_t* old_size); #endif #if defined(_msan_enabled_) @@ -17,6 +19,9 @@ extern "C" { // sanitizers API #if defined(_tsan_enabled_) void __tsan_acquire(void* a); void __tsan_release(void* a); + void* __tsan_get_current_fiber(void); + void __tsan_destroy_fiber(void* fiber); + void __tsan_switch_to_fiber(void* fiber, unsigned flags); #endif } // sanitizers API @@ -27,13 +32,42 @@ namespace NSan { TFiberContext() noexcept; TFiberContext(const void* stack, size_t len, const char* contName) noexcept; - ~TFiberContext() noexcept; + ~TFiberContext() noexcept { + if (!IsMainFiber_) { +#if defined(_asan_enabled_) + if (Token_) { + // destroy saved FakeStack + void* activeFakeStack = nullptr; + const void* activeStack = nullptr; + size_t activeStackSize = 0; + __sanitizer_start_switch_fiber(&activeFakeStack, (char*)Stack_, Len_); + __sanitizer_finish_switch_fiber(Token_, &activeStack, &activeStackSize); + __sanitizer_start_switch_fiber(nullptr, activeStack, activeStackSize); + __sanitizer_finish_switch_fiber(activeFakeStack, nullptr, nullptr); + } +#endif +#if defined(_tsan_enabled_) + __tsan_destroy_fiber(CurrentTSanFiberContext_); +#endif + } + } - void BeforeFinish() noexcept; - void BeforeSwitch(TFiberContext* old) noexcept; - void AfterSwitch() noexcept; + Y_FORCE_INLINE void BeforeSwitch(TFiberContext* old) noexcept { +#if defined(_asan_enabled_) + __sanitizer_start_switch_fiber(old ? &old->Token_ : nullptr, (char*)Stack_, Len_); +#else + (void)old; +#endif - static void AfterStart() noexcept; +#if defined(_tsan_enabled_) + __tsan_switch_to_fiber(CurrentTSanFiberContext_, /*flags =*/0); +#endif + } + void AfterSwitch() noexcept { +#if defined(_asan_enabled_) + __sanitizer_finish_switch_fiber(Token_, nullptr, nullptr); +#endif + } private: void* Token_; |