aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authorivanmorozov <ivanmorozov@yandex-team.com>2022-11-08 17:10:20 +0300
committerivanmorozov <ivanmorozov@yandex-team.com>2022-11-08 17:10:20 +0300
commit7edf3feae8880fd08afb5d90ca4de2f557dba5ab (patch)
treeadda565566b99b301d5da94dbaeba1ec26d2c39d /library/cpp
parentc8175ee109b2472cd3495c4e88c723873dbacfb5 (diff)
downloadydb-7edf3feae8880fd08afb5d90ca4de2f557dba5ab.tar.gz
pass away guard
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/actors/core/actor.h31
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>()...))