diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/coroutine/engine/trampoline.cpp | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/coroutine/engine/trampoline.cpp')
-rw-r--r-- | library/cpp/coroutine/engine/trampoline.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/library/cpp/coroutine/engine/trampoline.cpp b/library/cpp/coroutine/engine/trampoline.cpp new file mode 100644 index 0000000000..10ea69ddc3 --- /dev/null +++ b/library/cpp/coroutine/engine/trampoline.cpp @@ -0,0 +1,50 @@ +#include "impl.h" +#include "trampoline.h" + +#include "stack/stack_allocator.h" + +#include <util/system/info.h> +#include <util/system/protect.h> +#include <util/system/valgrind.h> +#include <util/system/yassert.h> + +#include <cstdlib> +#include <util/stream/format.h> + + +namespace NCoro { + +TTrampoline::TTrampoline(NStack::IAllocator& allocator, ui32 stackSize, TFunc f, TCont* cont) noexcept + : Stack_(allocator, stackSize, cont->Name()) + , Clo_{this, Stack_.Get(), cont->Name()} + , Ctx_(Clo_) + , Func_(std::move(f)) + , Cont_(cont) + {} + + void TTrampoline::DoRun() { + if (Cont_->Executor()->FailOnError()) { + Func_(Cont_); + } else { + try { + Func_(Cont_); + } catch (...) {} + } + + Cont_->Terminate(); + } + + TArrayRef<char> TTrampoline::Stack() noexcept { + return Stack_.Get(); + } + + const char* TTrampoline::ContName() const noexcept { + return Cont_->Name(); + } + + void TTrampoline::DoRunNaked() { + DoRun(); + + abort(); + } +} |