aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authorivanmorozov <ivanmorozov@yandex-team.com>2022-10-19 08:47:28 +0300
committerivanmorozov <ivanmorozov@yandex-team.com>2022-10-19 08:47:28 +0300
commitf5a084eaa391f826a8211c80439a5085c54d3e71 (patch)
tree230673f7194771bd302f0fa479a19c5a9eb0c7cb /library/cpp
parentd4131ab02bbf18d01b5a3e4e8b54d5a95c642150 (diff)
downloadydb-f5a084eaa391f826a8211c80439a5085c54d3e71.tar.gz
optimize interfaces
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/actors/core/actor.cpp8
-rw-r--r--library/cpp/actors/core/actor.h20
-rw-r--r--library/cpp/actors/core/actor_virtual.h34
-rw-r--r--library/cpp/actors/core/av_bootstrapped.cpp4
-rw-r--r--library/cpp/actors/core/av_bootstrapped.h4
5 files changed, 46 insertions, 24 deletions
diff --git a/library/cpp/actors/core/actor.cpp b/library/cpp/actors/core/actor.cpp
index 865eea89515..1247a1dd01e 100644
--- a/library/cpp/actors/core/actor.cpp
+++ b/library/cpp/actors/core/actor.cpp
@@ -182,15 +182,15 @@ namespace NActors {
return NHPTimer::GetSeconds(ElapsedTicks);
}
- void TActorCallbackBehaviour::Receive(IActor* actor, TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) {
- (actor->*StateFunc)(ev, ctx);
+ void TActorCallbackBehaviour::Receive(IActor* actor, TAutoPtr<IEventHandle>& ev) {
+ (actor->*StateFunc)(ev, TActivationContext::AsActorContext());
}
- void TActorVirtualBehaviour::Receive(IActor* actor, TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) {
+ void TActorVirtualBehaviour::Receive(IActor* actor, std::unique_ptr<IEventHandle> ev) {
Y_VERIFY(!!ev);
Y_ASSERT(dynamic_cast<IEventBehavioral*>(ev->GetBase()));
IEventBehavioral* eActor = static_cast<IEventBehavioral*>(ev->GetBase());
- eActor->Execute(actor, ev, ctx);
+ eActor->Execute(actor, std::move(ev));
}
}
diff --git a/library/cpp/actors/core/actor.h b/library/cpp/actors/core/actor.h
index 66451712a54..ca7bb83d087 100644
--- a/library/cpp/actors/core/actor.h
+++ b/library/cpp/actors/core/actor.h
@@ -222,7 +222,7 @@ namespace NActors {
class TActorVirtualBehaviour {
public:
- static void Receive(IActor* actor, TAutoPtr<IEventHandle>& ev, const TActorContext& ctx);
+ static void Receive(IActor* actor, std::unique_ptr<IEventHandle> ev);
public:
};
@@ -234,15 +234,19 @@ namespace NActors {
typedef void (IActor::* TReceiveFunc)(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx);
private:
- TReceiveFunc StateFunc;
+ TReceiveFunc StateFunc = nullptr;
public:
TActorCallbackBehaviour() = default;
TActorCallbackBehaviour(TReceiveFunc stateFunc)
: StateFunc(stateFunc) {
}
+ bool Initialized() const {
+ return !!StateFunc;
+ }
+
// NOTE: exceptions must not escape state function but if an exception hasn't be caught
// by the actor then we want to crash an see the stack
- void Receive(IActor* actor, TAutoPtr<IEventHandle>& ev, const TActorContext& ctx);
+ void Receive(IActor* actor, TAutoPtr<IEventHandle>& ev);
template <typename T>
void Become(T stateFunc) {
@@ -267,7 +271,6 @@ namespace NActors {
i64 ElapsedTicks;
friend void DoActorInit(TActorSystem*, IActor*, const TActorId&, const TActorId&);
friend class TDecorator;
- const bool VirtualUsage = false;
protected:
TActorCallbackBehaviour CImpl;
public:
@@ -315,7 +318,6 @@ namespace NActors {
IActor(ui32 activityType = OTHER)
: SelfActorId(TActorId())
, ElapsedTicks(0)
- , VirtualUsage(true)
, ActivityType(activityType)
, HandledEvents(0) {
}
@@ -376,12 +378,12 @@ namespace NActors {
TActorIdentity SelfId() const {
return SelfActorId;
}
- void Receive(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) {
+ void Receive(TAutoPtr<IEventHandle>& ev, const TActorContext& /*ctx*/) {
++HandledEvents;
- if (Y_UNLIKELY(VirtualUsage)) {
- TActorVirtualBehaviour::Receive(this, ev, ctx);
+ if (CImpl.Initialized()) {
+ CImpl.Receive(this, ev);
} else {
- CImpl.Receive(this, ev, ctx);
+ TActorVirtualBehaviour::Receive(this, std::unique_ptr<IEventHandle>(ev.Release()));
}
}
diff --git a/library/cpp/actors/core/actor_virtual.h b/library/cpp/actors/core/actor_virtual.h
index c8c2aebd7eb..9af1559c80b 100644
--- a/library/cpp/actors/core/actor_virtual.h
+++ b/library/cpp/actors/core/actor_virtual.h
@@ -4,24 +4,44 @@
namespace NActors {
+template <class TEvent>
+class TEventContext {
+private:
+ TEvent* Event;
+ std::unique_ptr<IEventHandle> Handle;
+public:
+ const TEvent* operator->() const {
+ return Event;
+ }
+ const IEventHandle& GetHandle() const {
+ return *Handle;
+ }
+ TEventContext(std::unique_ptr<IEventHandle> handle)
+ : Handle(std::move(handle))
+ {
+ Y_ASSERT(dynamic_cast<TEvent*>(Handle->GetBase()));
+ Event = static_cast<TEvent*>(Handle->GetBase());
+ Y_VERIFY(Event);
+ }
+};
+
class IEventBehavioral: public IEventBase {
protected:
- virtual bool DoExecute(IActor* actor, TAutoPtr<IEventHandle>& eventPtr, const NActors::TActorContext& ctx) = 0;
+ virtual bool DoExecute(IActor* actor, std::unique_ptr<IEventHandle> eventPtr) = 0;
public:
- bool Execute(IActor* actor, TAutoPtr<IEventHandle>& eventPtr, const NActors::TActorContext& ctx) {
- return DoExecute(actor, eventPtr, ctx);
+ bool Execute(IActor* actor, std::unique_ptr<IEventHandle> eventPtr) {
+ return DoExecute(actor, std::move(eventPtr));
}
};
template <class TEvent, class TExpectedActor>
class IEventForActor: public IEventBehavioral {
protected:
- virtual bool DoExecute(IActor* actor, TAutoPtr<IEventHandle>& eventPtr, const NActors::TActorContext& ctx) override {
+ virtual bool DoExecute(IActor* actor, std::unique_ptr<IEventHandle> eventPtr) override {
Y_ASSERT(dynamic_cast<TExpectedActor*>(actor));
- Y_ASSERT(dynamic_cast<TEvent*>(eventPtr->GetBase()));
auto* actorCorrect = static_cast<TExpectedActor*>(actor);
- TEvent* evPtrLocal(static_cast<TEvent*>(eventPtr->GetBase()));
- actorCorrect->ProcessEvent(evPtrLocal, eventPtr, ctx);
+ TEventContext<TEvent> context(std::move(eventPtr));
+ actorCorrect->ProcessEvent(context);
return true;
}
public:
diff --git a/library/cpp/actors/core/av_bootstrapped.cpp b/library/cpp/actors/core/av_bootstrapped.cpp
index ec37611d987..771177242ec 100644
--- a/library/cpp/actors/core/av_bootstrapped.cpp
+++ b/library/cpp/actors/core/av_bootstrapped.cpp
@@ -10,8 +10,8 @@ TAutoPtr<NActors::IEventHandle> TActorAutoStart::AfterRegister(const TActorId& s
return new IEventHandle(self, parentId, new TEventForStart, 0);
}
-void TActorAutoStart::ProcessEvent(TEventForStart* /*ev*/, TAutoPtr<IEventHandle>& handle, const NActors::TActorContext& ctx) {
- DoOnStart(handle->Sender, ctx);
+void TActorAutoStart::ProcessEvent(TEventContext<TEventForStart>& ev) {
+ DoOnStart(ev.GetHandle().Sender);
}
}
diff --git a/library/cpp/actors/core/av_bootstrapped.h b/library/cpp/actors/core/av_bootstrapped.h
index 16c110d4bea..5aa18842b06 100644
--- a/library/cpp/actors/core/av_bootstrapped.h
+++ b/library/cpp/actors/core/av_bootstrapped.h
@@ -7,10 +7,10 @@ class TEventForStart;
class TActorAutoStart: public IActorVirtual {
protected:
- virtual void DoOnStart(const TActorId& senderActorId, const ::NActors::TActorContext& ctx) = 0;
+ virtual void DoOnStart(const TActorId& senderActorId) = 0;
TAutoPtr<IEventHandle> AfterRegister(const TActorId& self, const TActorId& parentId) override;
public:
- void ProcessEvent(TEventForStart* ev, TAutoPtr<IEventHandle>& handle, const NActors::TActorContext& ctx);
+ void ProcessEvent(TEventContext<TEventForStart>& ev);
TActorAutoStart() {
}