diff options
author | alexvru <alexvru@ydb.tech> | 2023-03-16 16:40:52 +0300 |
---|---|---|
committer | alexvru <alexvru@ydb.tech> | 2023-03-16 16:40:52 +0300 |
commit | 87b918ead2dcdebbc8ba3798592ac1626a4f8dd5 (patch) | |
tree | c15062974829b112d33b5df46436d108f65cb3be /library/cpp | |
parent | 22189274e500f6002dfd22571598607a1f105326 (diff) | |
download | ydb-87b918ead2dcdebbc8ba3798592ac1626a4f8dd5.tar.gz |
Fix coroutine actor destructor
Diffstat (limited to 'library/cpp')
-rw-r--r-- | library/cpp/actors/core/actor_coroutine.cpp | 6 | ||||
-rw-r--r-- | library/cpp/actors/core/actor_coroutine.h | 5 |
2 files changed, 9 insertions, 2 deletions
diff --git a/library/cpp/actors/core/actor_coroutine.cpp b/library/cpp/actors/core/actor_coroutine.cpp index 18a222d5bb7..0fd54ff812a 100644 --- a/library/cpp/actors/core/actor_coroutine.cpp +++ b/library/cpp/actors/core/actor_coroutine.cpp @@ -28,7 +28,7 @@ namespace NActors { #endif } - TActorCoroImpl::~TActorCoroImpl() { + void TActorCoroImpl::Destroy() { if (!Finished && !NSan::TSanIsOn()) { // only resume when we have bootstrapped and Run() was entered and not yet finished; in other case simply terminate Y_VERIFY(!PendingEvent); InvokedFromDtor = true; @@ -128,6 +128,10 @@ namespace NActors { } } + TActorCoro::~TActorCoro() { + Impl->Destroy(); + } + STATEFN(TActorCoro::StateFunc) { if (Impl->ProcessEvent(ev)) { PassAway(); diff --git a/library/cpp/actors/core/actor_coroutine.h b/library/cpp/actors/core/actor_coroutine.h index fec92ae3f71..fdf928a8033 100644 --- a/library/cpp/actors/core/actor_coroutine.h +++ b/library/cpp/actors/core/actor_coroutine.h @@ -47,7 +47,7 @@ namespace NActors { TActorCoroImpl(size_t stackSize, bool allowUnhandledDtor = false); // specify stackSize explicitly for each actor; don't forget about overflow control gap - virtual ~TActorCoroImpl(); + virtual ~TActorCoroImpl() = default; virtual void Run() = 0; @@ -144,6 +144,7 @@ namespace NActors { private: friend class TActorCoro; bool ProcessEvent(THolder<IEventHandle> ev); + void Destroy(); private: /* Resume() function goes to actor coroutine context and continues (or starts) to execute it until actor finishes @@ -162,6 +163,8 @@ namespace NActors { , Impl(std::move(impl)) {} + ~TActorCoro(); + TAutoPtr<IEventHandle> AfterRegister(const TActorId& self, const TActorId& parent) override { return new IEventHandleFat(TEvents::TSystem::Bootstrap, 0, self, parent, {}, 0); } |