aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authoralexvru <alexvru@ydb.tech>2023-03-16 16:40:52 +0300
committeralexvru <alexvru@ydb.tech>2023-03-16 16:40:52 +0300
commit87b918ead2dcdebbc8ba3798592ac1626a4f8dd5 (patch)
treec15062974829b112d33b5df46436d108f65cb3be /library/cpp
parent22189274e500f6002dfd22571598607a1f105326 (diff)
downloadydb-87b918ead2dcdebbc8ba3798592ac1626a4f8dd5.tar.gz
Fix coroutine actor destructor
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/actors/core/actor_coroutine.cpp6
-rw-r--r--library/cpp/actors/core/actor_coroutine.h5
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);
}