diff options
author | ivanmorozov <ivanmorozov@yandex-team.com> | 2022-10-19 08:47:28 +0300 |
---|---|---|
committer | ivanmorozov <ivanmorozov@yandex-team.com> | 2022-10-19 08:47:28 +0300 |
commit | f5a084eaa391f826a8211c80439a5085c54d3e71 (patch) | |
tree | 230673f7194771bd302f0fa479a19c5a9eb0c7cb /library/cpp | |
parent | d4131ab02bbf18d01b5a3e4e8b54d5a95c642150 (diff) | |
download | ydb-f5a084eaa391f826a8211c80439a5085c54d3e71.tar.gz |
optimize interfaces
Diffstat (limited to 'library/cpp')
-rw-r--r-- | library/cpp/actors/core/actor.cpp | 8 | ||||
-rw-r--r-- | library/cpp/actors/core/actor.h | 20 | ||||
-rw-r--r-- | library/cpp/actors/core/actor_virtual.h | 34 | ||||
-rw-r--r-- | library/cpp/actors/core/av_bootstrapped.cpp | 4 | ||||
-rw-r--r-- | library/cpp/actors/core/av_bootstrapped.h | 4 |
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() { } |