diff options
author | ivanmorozov <ivanmorozov@yandex-team.com> | 2022-11-08 17:10:20 +0300 |
---|---|---|
committer | ivanmorozov <ivanmorozov@yandex-team.com> | 2022-11-08 17:10:20 +0300 |
commit | 7edf3feae8880fd08afb5d90ca4de2f557dba5ab (patch) | |
tree | adda565566b99b301d5da94dbaeba1ec26d2c39d /library/cpp | |
parent | c8175ee109b2472cd3495c4e88c723873dbacfb5 (diff) | |
download | ydb-7edf3feae8880fd08afb5d90ca4de2f557dba5ab.tar.gz |
pass away guard
Diffstat (limited to 'library/cpp')
-rw-r--r-- | library/cpp/actors/core/actor.h | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/library/cpp/actors/core/actor.h b/library/cpp/actors/core/actor.h index a1a17b54bbd..bd90344b37e 100644 --- a/library/cpp/actors/core/actor.h +++ b/library/cpp/actors/core/actor.h @@ -2,9 +2,12 @@ #include "event.h" #include "monotonic.h" -#include <util/system/tls.h> + #include <library/cpp/actors/util/local_process_key.h> +#include <util/system/tls.h> +#include <util/generic/noncopyable.h> + namespace NActors { class TActorSystem; class TMailboxTable; @@ -377,6 +380,32 @@ namespace NActors { } public: + class TPassAwayGuard: TMoveOnly { + private: + IActor* Owner = nullptr; + public: + TPassAwayGuard(TPassAwayGuard&& item) { + Owner = item.Owner; + item.Owner = nullptr; + } + + TPassAwayGuard(IActor* owner) + : Owner(owner) + { + + } + + ~TPassAwayGuard() { + if (Owner) { + Owner->PassAway(); + } + } + }; + + TPassAwayGuard PassAwayGuard() { + return TPassAwayGuard(this); + } + // must be called to wrap any call trasitions from one actor to another template<typename TActor, typename TMethod, typename... TArgs> static decltype((std::declval<TActor>().*std::declval<TMethod>())(std::declval<TArgs>()...)) |