From d5b981a233dd625815798e7f0db91fd14c2a30d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Fri, 5 Feb 2021 18:10:37 +0100 Subject: [PATCH] ksys: Add ActorMessageTransceiver --- data/uking_functions.csv | 30 ++++----- src/KingSystem/ActorSystem/actActor.h | 1 + src/KingSystem/Utils/CMakeLists.txt | 2 + .../Utils/Thread/ActorMessageTransceiver.cpp | 62 +++++++++++++++++++ .../Utils/Thread/ActorMessageTransceiver.h | 52 ++++++++++++++++ .../Utils/Thread/MessageTransceiverCommon.h | 18 +++--- 6 files changed, 142 insertions(+), 23 deletions(-) create mode 100644 src/KingSystem/Utils/Thread/ActorMessageTransceiver.cpp create mode 100644 src/KingSystem/Utils/Thread/ActorMessageTransceiver.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 9b62a8be..b8bd072d 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -88895,21 +88895,21 @@ 0x00000071010c02ec,sub_71010C02EC,204,_ZNK4ksys22MessageReceiverAdapter27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE 0x00000071010c03b8,sub_71010C03B8,92,_ZNK4ksys22MessageReceiverAdapter18getRuntimeTypeInfoEv 0x00000071010c0414,sub_71010C0414,140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys17MessageReceiverExEE9isDerivedEPKNS0_9InterfaceE -0x00000071010c04a0,j_j_Struct1A::dtor,4, -0x00000071010c04a4,sub_71010C04A4,36, -0x00000071010c04c8,sub_71010C04C8,16, -0x00000071010c04d8,sub_71010C04D8,16, -0x00000071010c04e8,sub_71010C04E8,128, -0x00000071010c0568,sub_71010C0568,132, -0x00000071010c05ec,sub_71010C05EC,80, -0x00000071010c063c,sub_71010C063C,88, -0x00000071010c0694,MessageSender::sendMaybe,188, -0x00000071010c0750,sub_71010C0750,188, -0x00000071010c080c,sub_71010C080C,236, -0x00000071010c08f8,sub_71010C08F8,236, -0x00000071010c09e4,sub_71010C09E4,8, -0x00000071010c09ec,sub_71010C09EC,204, -0x00000071010c0ab8,sub_71010C0AB8,92, +0x00000071010c04a0,j_j_Struct1A::dtor,4,_ZN4ksys23ActorMessageTransceiver8ReceiverD1Ev +0x00000071010c04a4,sub_71010C04A4,36,_ZN4ksys23ActorMessageTransceiver8ReceiverD0Ev +0x00000071010c04c8,sub_71010C04C8,16,_ZN4ksys23ActorMessageTransceiver8Receiver13handleMessageERKNS_7MessageE +0x00000071010c04d8,sub_71010C04D8,16,_ZN4ksys23ActorMessageTransceiver8Receiver9handleAckERKNS_10MessageAckE +0x00000071010c04e8,sub_71010C04E8,128,_ZN4ksys23ActorMessageTransceiverC1ERNS0_8IHandlerE +0x00000071010c0568,sub_71010C0568,132,_ZN4ksys23ActorMessageTransceiverC1ERNS0_8IHandlerEPNS_3act5ActorE +0x00000071010c05ec,sub_71010C05EC,80,_ZN4ksys23ActorMessageTransceiverD1Ev +0x00000071010c063c,sub_71010C063C,88,_ZN4ksys23ActorMessageTransceiverD0Ev +0x00000071010c0694,MessageSender::sendMaybe,188,_ZN4ksys23ActorMessageTransceiver11sendMessageERKNS_16MesTransceiverIdERKNS_11MessageTypeEPvb +0x00000071010c0750,sub_71010C0750,188,_ZN4ksys23ActorMessageTransceiver29sendMessageOnProcessingThreadERKNS_16MesTransceiverIdERKNS_11MessageTypeEPvb +0x00000071010c080c,sub_71010C080C,236,_ZN4ksys23ActorMessageTransceiver11sendMessageERNS_14IMessageBrokerERKNS_11MessageTypeEPvb +0x00000071010c08f8,sub_71010C08F8,236,_ZN4ksys23ActorMessageTransceiver29sendMessageOnProcessingThreadERNS_14IMessageBrokerERKNS_11MessageTypeEPvb +0x00000071010c09e4,sub_71010C09E4,8,_ZN4ksys23ActorMessageTransceiver11getReceiverEv +0x00000071010c09ec,sub_71010C09EC,204,_ZNK4ksys23ActorMessageTransceiver8Receiver27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071010c0ab8,sub_71010C0AB8,92,_ZNK4ksys23ActorMessageTransceiver8Receiver18getRuntimeTypeInfoEv 0x00000071010c0b14,Event::ctorEvent,32,_ZN4ksys4util5EventC1Ev 0x00000071010c0b34,Event::ctorDisposer,32,_ZN4ksys4util5EventC1EPN4sead4HeapE 0x00000071010c0b54,Event::ctorEvent2,36,_ZN4ksys4util5EventC1Eb diff --git a/src/KingSystem/ActorSystem/actActor.h b/src/KingSystem/ActorSystem/actActor.h index 36df33a3..f5e4a822 100644 --- a/src/KingSystem/ActorSystem/actActor.h +++ b/src/KingSystem/ActorSystem/actActor.h @@ -33,6 +33,7 @@ public: _18 = 0x18, _25 = 0x25, _2b = 0x2b, + _2e = 0x2e, }; enum class DeleteType { diff --git a/src/KingSystem/Utils/CMakeLists.txt b/src/KingSystem/Utils/CMakeLists.txt index 226992f0..a7baab79 100644 --- a/src/KingSystem/Utils/CMakeLists.txt +++ b/src/KingSystem/Utils/CMakeLists.txt @@ -1,4 +1,6 @@ target_sources(uking PRIVATE + Thread/ActorMessageTransceiver.cpp + Thread/ActorMessageTransceiver.h Thread/Event.cpp Thread/Event.h Thread/GameTaskThread.cpp diff --git a/src/KingSystem/Utils/Thread/ActorMessageTransceiver.cpp b/src/KingSystem/Utils/Thread/ActorMessageTransceiver.cpp new file mode 100644 index 00000000..5646de14 --- /dev/null +++ b/src/KingSystem/Utils/Thread/ActorMessageTransceiver.cpp @@ -0,0 +1,62 @@ +#include "KingSystem/Utils/Thread/ActorMessageTransceiver.h" +#include "KingSystem/ActorSystem/actActor.h" +#include "KingSystem/Utils/Thread/MessageTransceiverCommon.h" + +namespace ksys { + +ActorMessageTransceiver::ActorMessageTransceiver(IHandler& handler) : mReceiver(handler) { + registerReceiver(mReceiver); +} + +ActorMessageTransceiver::ActorMessageTransceiver(IHandler& handler, act::Actor* actor) + : mReceiver(handler), mActor(actor) { + registerReceiver(mReceiver); +} + +ActorMessageTransceiver::~ActorMessageTransceiver() { + deregisterReceiver(mReceiver); +} + +bool ActorMessageTransceiver::getDebugArg(bool ack) const { + return mActor && mActor->checkFlag(act::Actor::ActorFlag::_2e) && ack; +} + +bool ActorMessageTransceiver::sendMessage(const MesTransceiverId& dest, const MessageType& type, + void* user_data, bool ack) { + return sendMessageImpl(this, dest, type, user_data, ack, getDebugArg(ack)); +} + +bool ActorMessageTransceiver::sendMessageOnProcessingThread(const MesTransceiverId& dest, + const MessageType& type, + void* user_data, bool ack) { + return sendMessageOnProcessingThreadImpl(this, dest, type, user_data, ack, getDebugArg(ack)); +} + +bool ActorMessageTransceiver::sendMessage(IMessageBroker& broker, const MessageType& type, + void* user_data, bool ack) { + return sendMessageImpl(this, broker, type, user_data, ack, getDebugArg(ack)); +} + +bool ActorMessageTransceiver::sendMessageOnProcessingThread(IMessageBroker& broker, + const MessageType& type, + void* user_data, bool ack) { + return sendMessageOnProcessingThreadImpl(this, broker, type, user_data, ack, getDebugArg(ack)); +} + +MessageReceiverEx* ActorMessageTransceiver::getReceiver() { + return &mReceiver; +} + +ActorMessageTransceiver::Receiver::Receiver(IHandler& handler) : mHandler(handler) {} + +ActorMessageTransceiver::Receiver::~Receiver() = default; + +int ActorMessageTransceiver::Receiver::handleMessage(const Message& message) { + return mHandler.handleMessage(message); +} + +void ActorMessageTransceiver::Receiver::handleAck(const MessageAck& ack) { + return mHandler.handleAck(ack); +} + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/ActorMessageTransceiver.h b/src/KingSystem/Utils/Thread/ActorMessageTransceiver.h new file mode 100644 index 00000000..6a7f24f2 --- /dev/null +++ b/src/KingSystem/Utils/Thread/ActorMessageTransceiver.h @@ -0,0 +1,52 @@ +#pragma once + +#include "KingSystem/Utils/Thread/MessageTransceiverBase.h" +#include "KingSystem/Utils/Thread/MessageTransceiverRxOnly.h" +#include "KingSystem/Utils/Thread/MessageTransceiverTxOnly.h" + +namespace ksys { + +namespace act { +class Actor; +} + +class ActorMessageTransceiver final : public MessageTransceiverBase { +public: + class IHandler : public MessageTransceiverRxOnly::IHandler, + public MessageTransceiverTxOnly::IHandler {}; + KSYS_CHECK_SIZE_NX150(IHandler, 0x10); + + explicit ActorMessageTransceiver(IHandler& handler); + explicit ActorMessageTransceiver(IHandler& handler, act::Actor* actor); + ~ActorMessageTransceiver() override; + bool sendMessage(const MesTransceiverId& dest, const MessageType& type, void* user_data, + bool ack) override; + bool sendMessageOnProcessingThread(const MesTransceiverId& dest, const MessageType& type, + void* user_data, bool ack) override; + bool sendMessage(IMessageBroker& broker, const MessageType& type, void* user_data, + bool ack) override; + bool sendMessageOnProcessingThread(IMessageBroker& broker, const MessageType& type, + void* user_data, bool ack) override; + MessageReceiverEx* getReceiver() override; + +private: + class Receiver : public MessageReceiverEx { + SEAD_RTTI_OVERRIDE(Receiver, MessageReceiverEx) + public: + explicit Receiver(IHandler& handler); + ~Receiver() override; + int handleMessage(const Message& message) override; + void handleAck(const MessageAck& ack) override; + + private: + IHandler& mHandler; + }; + + // TODO: rename if we figure out what this is used for + bool getDebugArg(bool ack) const; + + Receiver mReceiver; + act::Actor* mActor{}; +}; + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverCommon.h b/src/KingSystem/Utils/Thread/MessageTransceiverCommon.h index 0e69d68c..4f4f0fc9 100644 --- a/src/KingSystem/Utils/Thread/MessageTransceiverCommon.h +++ b/src/KingSystem/Utils/Thread/MessageTransceiverCommon.h @@ -7,10 +7,10 @@ namespace ksys { template bool sendMessageImpl(T* transceiver, const MesTransceiverId& dest, const MessageType& type, - void* user_data, bool ack) { + void* user_data, bool ack, bool x = false) { MessageDispatcherBase* dispatcher = transceiver->getDispatcher(); const bool ok = dispatcher->sendMessage(*transceiver->getReceiver()->MessageReceiver::getId(), - dest, type, user_data, ack, false); + dest, type, user_data, ack, x); if (ok) transceiver->getReceiver()->setFlag(ack); @@ -20,10 +20,11 @@ bool sendMessageImpl(T* transceiver, const MesTransceiverId& dest, const Message template bool sendMessageOnProcessingThreadImpl(T* transceiver, const MesTransceiverId& dest, - const MessageType& type, void* user_data, bool ack) { + const MessageType& type, void* user_data, bool ack, + bool x = false) { MessageDispatcherBase* dispatcher = transceiver->getDispatcher(); const bool ok = dispatcher->sendMessageOnProcessingThread( - *transceiver->getReceiver()->MessageReceiver::getId(), dest, type, user_data, ack, false); + *transceiver->getReceiver()->MessageReceiver::getId(), dest, type, user_data, ack, x); if (ok) transceiver->getReceiver()->setFlag(ack); @@ -33,11 +34,11 @@ bool sendMessageOnProcessingThreadImpl(T* transceiver, const MesTransceiverId& d template bool sendMessageImpl(T* transceiver, IMessageBroker& broker, const MessageType& type, - void* user_data, bool ack) { + void* user_data, bool ack, bool x = false) { MessageDispatcherBase* dispatcher = transceiver->getDispatcher(); const bool ok = dispatcher->sendMessage(*transceiver->getReceiver()->MessageReceiver::getId(), - *transceiver->getRegister(broker), type, user_data, ack, false); + *transceiver->getRegister(broker), type, user_data, ack, x); if (ok) { for (int i = 0, n = broker.countTransceivers(); i < n; ++i) @@ -49,11 +50,12 @@ bool sendMessageImpl(T* transceiver, IMessageBroker& broker, const MessageType& template bool sendMessageOnProcessingThreadImpl(T* transceiver, IMessageBroker& broker, - const MessageType& type, void* user_data, bool ack) { + const MessageType& type, void* user_data, bool ack, + bool x = false) { MessageDispatcherBase* dispatcher = transceiver->getDispatcher(); const bool ok = dispatcher->sendMessageOnProcessingThread( *transceiver->getReceiver()->MessageReceiver::getId(), *transceiver->getRegister(broker), - type, user_data, ack, false); + type, user_data, ack, x); if (ok) { for (int i = 0, n = broker.countTransceivers(); i < n; ++i)