diff --git a/data/uking_functions.csv b/data/uking_functions.csv index c21ddc15..60c04e5d 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -48872,7 +48872,7 @@ 0x00000071007b6e1c,sub_71007B6E1C,92, 0x00000071007b6e78,sub_71007B6E78,160, 0x00000071007b6f18,sub_71007B6F18,24, -0x00000071007b6f30,sub_71007B6F30,12,_ZN4ksys15MessageReceiver9setField0ERKj +0x00000071007b6f30,sub_71007B6F30,12,_ZN4ksys15MessageReceiver10setQueueIdERKj 0x00000071007b6f3c,sub_71007B6F3C,88, 0x00000071007b6f94,StateMachineWrapper::dtor,80, 0x00000071007b6fe4,StateMachineWrapper::dtorDelete,88, @@ -88845,15 +88845,15 @@ 0x00000071010bfccc,sub_71010BFCCC,8,_ZNK4ksys7Message11getUserDataEv 0x00000071010bfcd4,sub_71010BFCD4,8,_ZNK4ksys7Message10getField48Ev 0x00000071010bfcdc,sub_71010BFCDC,44,_ZNK4ksys7Message17shouldBeProcessedEv -0x00000071010bfd08,sub_71010BFD08,8,_ZNK4ksys7Message10getField60Ev +0x00000071010bfd08,sub_71010BFD08,8,_ZNK4ksys7Message9shouldAckEv 0x00000071010bfd10,sub_71010BFD10,36,_ZN4ksys7Message14setDestinationERKNS_16MesTransceiverIdE 0x00000071010bfd34,sub_71010BFD34,12,_ZN4ksys7Message10setField48ERKj 0x00000071010bfd40,Struct1A::ctor,56,_ZN4ksys15MessageReceiverC1Ev 0x00000071010bfd78,Struct1A::dtor,28,_ZN4ksys15MessageReceiverD1Ev 0x00000071010bfd94,j__ZdlPv_1195,4,_ZN4ksys15MessageReceiverD0Ev 0x00000071010bfd98,Struct1C::getId,8,_ZN4ksys15MessageReceiver5getIdEv -0x00000071010bfda0,sub_71010BFDA0,8,_ZN4ksys15MessageReceiver2m1EPv -0x00000071010bfda8,nullsub_4504,4,_ZN4ksys15MessageReceiver2m2EPv +0x00000071010bfda0,sub_71010BFDA0,8,_ZN4ksys15MessageReceiver7receiveERKNS_7MessageE +0x00000071010bfda8,nullsub_4504,4,_ZN4ksys15MessageReceiver7receiveERKNS_10MessageAckE 0x00000071010bfdac,StateMachine::ctor,44, 0x00000071010bfdd8,StateMachine::getState,64, 0x00000071010bfe18,StateMachine::run,76, @@ -88875,13 +88875,13 @@ 0x00000071010c0004,Struct1B::ctor,56,_ZN4ksys17MessageReceiverExC1Ev 0x00000071010c003c,j_Struct1A::dtor,4,_ZN4ksys17MessageReceiverExD1Ev 0x00000071010c0040,sub_71010C0040,36,_ZN4ksys17MessageReceiverExD0Ev -0x00000071010c0064,sub_71010C0064,12,_ZN4ksys17MessageReceiverEx2m1EPv -0x00000071010c0070,sub_71010C0070,60,_ZN4ksys17MessageReceiverEx2m2EPv +0x00000071010c0064,sub_71010C0064,12,_ZN4ksys17MessageReceiverEx7receiveERKNS_7MessageE +0x00000071010c0070,sub_71010C0070,60,_ZN4ksys17MessageReceiverEx7receiveERKNS_10MessageAckE 0x00000071010c00ac,sub_71010C00AC,32,_ZNK4ksys17MessageReceiverEx9checkFlagEv 0x00000071010c00cc,sub_71010C00CC,16,_ZNK4ksys17MessageReceiverEx12checkCounterEv 0x00000071010c00dc,sub_71010C00DC,48,_ZN4ksys17MessageReceiverEx7setFlagEb -0x00000071010c010c,sub_71010C010C,8,_ZN4ksys17MessageReceiverEx2m6EPv -0x00000071010c0114,nullsub_4510,4,_ZN4ksys17MessageReceiverEx2m7EPv +0x00000071010c010c,sub_71010C010C,8,_ZN4ksys17MessageReceiverEx13handleMessageERKNS_7MessageE +0x00000071010c0114,nullsub_4510,4,_ZN4ksys17MessageReceiverEx9handleAckERKNS_10MessageAckE 0x00000071010c0118,Struct1C::x,16,_ZN4ksys17MessageReceiverEx14setFlagPointerEPh 0x00000071010c0128,sub_71010C0128,16,_ZN4ksys17MessageReceiverEx16clearFlagPointerEv 0x00000071010c0138,sub_71010C0138,112,_ZNK4ksys17MessageReceiverEx27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE @@ -88890,8 +88890,8 @@ 0x00000071010c026c,Struct1C::ctor,56,_ZN4ksys22MessageReceiverAdapterC1EPNS_15MessageReceiverE 0x00000071010c02a4,Struct1C::dtor,4,_ZN4ksys22MessageReceiverAdapterD1Ev 0x00000071010c02a8,sub_71010C02A8,36,_ZN4ksys22MessageReceiverAdapterD0Ev -0x00000071010c02cc,sub_71010C02CC,16,_ZN4ksys22MessageReceiverAdapter2m6EPv -0x00000071010c02dc,sub_71010C02DC,16,_ZN4ksys22MessageReceiverAdapter2m7EPv +0x00000071010c02cc,sub_71010C02CC,16,_ZN4ksys22MessageReceiverAdapter13handleMessageERKNS_7MessageE +0x00000071010c02dc,sub_71010C02DC,16,_ZN4ksys22MessageReceiverAdapter9handleAckERKNS_10MessageAckE 0x00000071010c02ec,sub_71010C02EC,204,_ZNK4ksys22MessageReceiverAdapter27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE 0x00000071010c03b8,sub_71010C03B8,92,_ZNK4ksys22MessageReceiverAdapter18getRuntimeTypeInfoEv 0x00000071010c0414,sub_71010C0414,140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys17MessageReceiverExEE9isDerivedEPKNS0_9InterfaceE @@ -96836,10 +96836,10 @@ 0x00000071012fd400,sub_71012FD400,92,_ZThn632_NK4ksys3res4UMii18getRuntimeTypeInfoEv 0x00000071012fd45c,sub_71012FD45C,8,_ZThn632_NK4ksys3res4UMii10needsParseEv 0x00000071012fd464,sub_71012FD464,372,_ZN4ksys3res4UMii33checkDerivedRuntimeTypeInfoStaticEPKN4sead15RuntimeTypeInfo9InterfaceE -0x00000071012fd5d8,sub_71012FD5D8,24, -0x00000071012fd5f0,nullsub_4849,4, -0x00000071012fd5f4,j__ZdlPv_1323,4, -0x00000071012fd5f8,sub_71012FD5F8,532, +0x00000071012fd5d8,sub_71012FD5D8,24,_ZN4ksys16MessageProcessorC1EPNS0_6LoggerE +0x00000071012fd5f0,nullsub_4849,4,_ZN4ksys16MessageProcessorD1Ev +0x00000071012fd5f4,j__ZdlPv_1323,4,_ZN4ksys16MessageProcessorD0Ev +0x00000071012fd5f8,sub_71012FD5F8,532,_ZN4ksys16MessageProcessor7processEPNS_7MessageE 0x00000071012fd80c,ThreadD0::ctor,60,_ZN4ksys4util9TaskQueueC1EPN4sead4HeapE 0x00000071012fd848,sub_71012FD848,52,_ZN4ksys4util9TaskQueueD2Ev 0x00000071012fd87c,sub_71012FD87C,60,_ZN4ksys4util9TaskQueueD0Ev @@ -97508,14 +97508,14 @@ 0x0000007101320b24,sub_7101320B24,4, 0x0000007101320b28,sub_7101320B28,88, 0x0000007101320b80,sub_7101320B80,32, -0x0000007101320ba0,sub_7101320BA0,44, -0x0000007101320bcc,nullsub_4864,4, -0x0000007101320bd0,j__ZdlPv_1364,4, -0x0000007101320bd4,sub_7101320BD4,8, -0x0000007101320bdc,sub_7101320BDC,8, -0x0000007101320be4,sub_7101320BE4,8, -0x0000007101320bec,sub_7101320BEC,8, -0x0000007101320bf4,sub_7101320BF4,8, +0x0000007101320ba0,sub_7101320BA0,44,_ZN4ksys10MessageAckC1EbbRKNS_16MesTransceiverIdERKNS_11MessageTypeEPv +0x0000007101320bcc,nullsub_4864,4,_ZN4ksys10MessageAckD1Ev +0x0000007101320bd0,j__ZdlPv_1364,4,_ZN4ksys10MessageAckD0Ev +0x0000007101320bd4,sub_7101320BD4,8,_ZNK4ksys10MessageAck18isDestinationValidEv +0x0000007101320bdc,sub_7101320BDC,8,_ZNK4ksys10MessageAck9isSuccessEv +0x0000007101320be4,sub_7101320BE4,8,_ZNK4ksys10MessageAck14getDestinationEv +0x0000007101320bec,sub_7101320BEC,8,_ZNK4ksys10MessageAck7getTypeEv +0x0000007101320bf4,sub_7101320BF4,8,_ZNK4ksys10MessageAck11getUserDataEv 0x0000007101320bfc,sub_7101320BFC,48, 0x0000007101320c2c,sub_7101320C2C,204, 0x0000007101320cf8,sub_7101320CF8,92, diff --git a/src/KingSystem/Utils/CMakeLists.txt b/src/KingSystem/Utils/CMakeLists.txt index ec2e0301..e071707f 100644 --- a/src/KingSystem/Utils/CMakeLists.txt +++ b/src/KingSystem/Utils/CMakeLists.txt @@ -9,8 +9,12 @@ target_sources(uking PRIVATE Thread/ManagedTaskHandle.h Thread/Message.cpp Thread/Message.h + Thread/MessageAck.cpp + Thread/MessageAck.h Thread/MessageDispatcherBase.cpp Thread/MessageDispatcherBase.h + Thread/MessageProcessor.cpp + Thread/MessageProcessor.h Thread/MessageReceiver.cpp Thread/MessageReceiver.h Thread/MessageReceiverAdapter.cpp diff --git a/src/KingSystem/Utils/Thread/Message.cpp b/src/KingSystem/Utils/Thread/Message.cpp index 96eada1d..0ec58ee5 100644 --- a/src/KingSystem/Utils/Thread/Message.cpp +++ b/src/KingSystem/Utils/Thread/Message.cpp @@ -6,13 +6,14 @@ Message::Message() = default; Message::Message(const MesTransceiverId& source, const MesTransceiverId& destination, const MessageType& type, void* user_data, const Message::DelayParams& delay_params, - bool x) + bool ack) : mSource(source), mDestination(destination), mType(type), mUserData(user_data), - mDelayParams(delay_params), _60(x) {} + mDelayParams(delay_params), mShouldAck(ack) {} Message::Message(const MesTransceiverId& source, const MessageType& type, void* user_data, - const Message::DelayParams& delay_params, bool x) - : mSource(source), mType(type), mUserData(user_data), mDelayParams(delay_params), _60(x) {} + const Message::DelayParams& delay_params, bool ack) + : mSource(source), mType(type), mUserData(user_data), mDelayParams(delay_params), + mShouldAck(ack) {} Message::~Message() = default; @@ -46,8 +47,8 @@ bool Message::shouldBeProcessed() const { return mDelayParams.delayer->shouldProcessMessage(); } -bool Message::getField60() const { - return _60; +bool Message::shouldAck() const { + return mShouldAck; } void Message::setDestination(const MesTransceiverId& dest) { diff --git a/src/KingSystem/Utils/Thread/Message.h b/src/KingSystem/Utils/Thread/Message.h index 15b99452..c534ffbd 100644 --- a/src/KingSystem/Utils/Thread/Message.h +++ b/src/KingSystem/Utils/Thread/Message.h @@ -38,9 +38,9 @@ public: Message(); Message(const MesTransceiverId& source, const MesTransceiverId& destination, - const MessageType& type, void* user_data, const DelayParams& delay_params, bool x); + const MessageType& type, void* user_data, const DelayParams& delay_params, bool ack); Message(const MesTransceiverId& source, const MessageType& type, void* user_data, - const DelayParams& delay_params, bool x); + const DelayParams& delay_params, bool ack); virtual ~Message(); @@ -49,11 +49,18 @@ public: virtual const MessageType& getType() const; virtual void* getUserData() const; virtual u32 getField48() const; - virtual bool getField60() const; + virtual bool shouldAck() const; virtual void setDestination(const MesTransceiverId& dest); virtual void setField48(const u32& v); virtual bool shouldBeProcessed() const; + bool hasDelayer() const { return mDelayParams.delayer != nullptr; } + + void decrementDelay() { + if (mDelayParams.delay_ticks != 0) + --mDelayParams.delay_ticks; + } + private: MesTransceiverId mSource{}; MesTransceiverId mDestination{}; @@ -61,7 +68,7 @@ private: void* mUserData{}; u32 _48 = 0xffffffff; DelayParams mDelayParams{}; - bool _60 = true; + bool mShouldAck = true; }; } // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageAck.cpp b/src/KingSystem/Utils/Thread/MessageAck.cpp new file mode 100644 index 00000000..d15df6b5 --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageAck.cpp @@ -0,0 +1,33 @@ +#include "KingSystem/Utils/Thread/MessageAck.h" + +namespace ksys { + +MessageAck::MessageAck(bool dest_valid, bool success, + const MesTransceiverId& destination, const MessageType& type, + void* user_data) + : mDestValid(dest_valid), mSuccess(success), mDestination(destination), mType(type), + mUserData(user_data) {} + +MessageAck::~MessageAck() = default; + +bool MessageAck::isDestinationValid() const { + return mDestValid; +} + +bool MessageAck::isSuccess() const { + return mSuccess; +} + +const MesTransceiverId& MessageAck::getDestination() const { + return mDestination; +} + +const MessageType& MessageAck::getType() const { + return mType; +} + +void* MessageAck::getUserData() const { + return mUserData; +} + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageAck.h b/src/KingSystem/Utils/Thread/MessageAck.h new file mode 100644 index 00000000..e147ca26 --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageAck.h @@ -0,0 +1,28 @@ +#pragma once + +namespace ksys { + +struct MesTransceiverId; +struct MessageType; + +class MessageAck { +public: + MessageAck(bool dest_valid, bool success, const MesTransceiverId& destination, + const MessageType& type, void* user_data); + virtual ~MessageAck(); + + virtual bool isDestinationValid() const; + virtual bool isSuccess() const; + virtual const MesTransceiverId& getDestination() const; + virtual const MessageType& getType() const; + virtual void* getUserData() const; + +private: + bool mDestValid{}; + bool mSuccess{}; + const MesTransceiverId& mDestination; + const MessageType& mType; + void* mUserData{}; +}; + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageProcessor.cpp b/src/KingSystem/Utils/Thread/MessageProcessor.cpp new file mode 100644 index 00000000..296d24a8 --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageProcessor.cpp @@ -0,0 +1,59 @@ +#include "KingSystem/Utils/Thread/MessageProcessor.h" +#include +#include "KingSystem/Utils/Thread/Message.h" +#include "KingSystem/Utils/Thread/MessageAck.h" +#include "KingSystem/Utils/Thread/MessageReceiver.h" + +namespace ksys { + +MessageProcessor::MessageProcessor(Logger* logger) : mLogger(logger) {} + +MessageProcessor::~MessageProcessor() = default; + +static bool checkTransceiver(const MesTransceiverId& id) { + if (!id.next) + return false; + + MesTransceiverId* next = *id.next; + if (!next) + return false; + + const auto& fields = [](const MesTransceiverId& i) { return std::tie(i.queue_id, i.id); }; + return fields(id) == fields(*next); +} + +bool MessageProcessor::process(Message* message) { + message->decrementDelay(); + + if (!message->shouldBeProcessed()) + return false; + + bool success = false; + bool dest_valid = false; + + const auto& dest = message->getDestination(); + if (checkTransceiver(dest)) { + success = dest.receiver->receive(*message) & 1; + mLogger->log(*message, success); + dest_valid = true; + } + + const auto& src = message->getSource(); + if (!message->hasDelayer() || checkTransceiver(src)) { + if (message->shouldAck()) { + const auto& source = message->getSource(); + if (checkTransceiver(source)) { + auto* receiver = source.receiver; + const MessageAck ack{dest_valid, success, message->getDestination(), + message->getType(), message->getUserData()}; + receiver->receive(ack); + } + } + } else { + mLogger->log(*message, false); + } + + return true; +} + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageProcessor.h b/src/KingSystem/Utils/Thread/MessageProcessor.h new file mode 100644 index 00000000..c934e37e --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageProcessor.h @@ -0,0 +1,24 @@ +#pragma once + +namespace ksys { + +class Message; + +class MessageProcessor { +public: + class Logger { + public: + Logger() = default; + virtual ~Logger() = default; + virtual void log(const Message& message, bool success) = 0; + }; + + explicit MessageProcessor(Logger* logger); + virtual ~MessageProcessor(); + virtual bool process(Message* message); + +private: + Logger* mLogger{}; +}; + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageReceiver.cpp b/src/KingSystem/Utils/Thread/MessageReceiver.cpp index e4b96762..cb40c706 100644 --- a/src/KingSystem/Utils/Thread/MessageReceiver.cpp +++ b/src/KingSystem/Utils/Thread/MessageReceiver.cpp @@ -12,10 +12,10 @@ MesTransceiverId* MessageReceiver::getId() { return &mTransceiverId; } -bool MessageReceiver::m1(void*) { +int MessageReceiver::receive(const Message& message) { return true; } -void MessageReceiver::m2(void* x) {} +void MessageReceiver::receive(const MessageAck& ack) {} } // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageReceiver.h b/src/KingSystem/Utils/Thread/MessageReceiver.h index 4b92e4fe..f3533eb1 100644 --- a/src/KingSystem/Utils/Thread/MessageReceiver.h +++ b/src/KingSystem/Utils/Thread/MessageReceiver.h @@ -5,14 +5,17 @@ namespace ksys { +class Message; +class MessageAck; + class MessageReceiver { public: MessageReceiver(); virtual ~MessageReceiver(); virtual MesTransceiverId* getId(); - virtual bool m1(void*); - virtual void m2(void* x); - virtual void setField0(const u32& value) { mTransceiverId.queue_id = value; } + virtual int receive(const Message& message); + virtual void receive(const MessageAck& ack); + virtual void setQueueId(const u32& id) { mTransceiverId.queue_id = id; } protected: MesTransceiverId mTransceiverId; diff --git a/src/KingSystem/Utils/Thread/MessageReceiverAdapter.cpp b/src/KingSystem/Utils/Thread/MessageReceiverAdapter.cpp index a982def4..49030411 100644 --- a/src/KingSystem/Utils/Thread/MessageReceiverAdapter.cpp +++ b/src/KingSystem/Utils/Thread/MessageReceiverAdapter.cpp @@ -2,17 +2,16 @@ namespace ksys { -MessageReceiverAdapter::MessageReceiverAdapter(MessageReceiver* wrapped) - : mReceiver(wrapped) {} +MessageReceiverAdapter::MessageReceiverAdapter(MessageReceiver* wrapped) : mReceiver(wrapped) {} MessageReceiverAdapter::~MessageReceiverAdapter() = default; -bool MessageReceiverAdapter::m6(void* x) { - return mReceiver->m1(x); +int MessageReceiverAdapter::handleMessage(const Message& message) { + return mReceiver->receive(message); } -void MessageReceiverAdapter::m7(void* x) { - return mReceiver->m2(x); +void MessageReceiverAdapter::handleAck(const MessageAck& ack) { + return mReceiver->receive(ack); } } // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageReceiverAdapter.h b/src/KingSystem/Utils/Thread/MessageReceiverAdapter.h index 41b803b2..3ee3e7e8 100644 --- a/src/KingSystem/Utils/Thread/MessageReceiverAdapter.h +++ b/src/KingSystem/Utils/Thread/MessageReceiverAdapter.h @@ -11,8 +11,8 @@ public: ~MessageReceiverAdapter() override; protected: - bool m6(void* x) override; - void m7(void* x) override; + int handleMessage(const Message& message) override; + void handleAck(const MessageAck& ack) override; private: MessageReceiver* mReceiver; diff --git a/src/KingSystem/Utils/Thread/MessageReceiverEx.cpp b/src/KingSystem/Utils/Thread/MessageReceiverEx.cpp index 06006cea..40a7b894 100644 --- a/src/KingSystem/Utils/Thread/MessageReceiverEx.cpp +++ b/src/KingSystem/Utils/Thread/MessageReceiverEx.cpp @@ -6,12 +6,12 @@ MessageReceiverEx::MessageReceiverEx() = default; MessageReceiverEx::~MessageReceiverEx() = default; -bool MessageReceiverEx::m1(void* x) { - return m6(x); +int MessageReceiverEx::receive(const Message& message) { + return handleMessage(message); } -void MessageReceiverEx::m2(void* x) { - m7(x); +void MessageReceiverEx::receive(const MessageAck& ack) { + handleAck(ack); --mCounter; static_cast(mCounter.load()); } @@ -32,11 +32,11 @@ void MessageReceiverEx::setFlag(bool update_counter) { } } -bool MessageReceiverEx::m6(void* x) { +int MessageReceiverEx::handleMessage(const Message& message) { return true; } -void MessageReceiverEx::m7(void* x) {} +void MessageReceiverEx::handleAck(const MessageAck& ack) {} void MessageReceiverEx::setFlagPointer(u8* ptr) { if (ptr) { diff --git a/src/KingSystem/Utils/Thread/MessageReceiverEx.h b/src/KingSystem/Utils/Thread/MessageReceiverEx.h index 48470314..61f0571a 100644 --- a/src/KingSystem/Utils/Thread/MessageReceiverEx.h +++ b/src/KingSystem/Utils/Thread/MessageReceiverEx.h @@ -10,8 +10,8 @@ class MessageReceiverEx : public MessageReceiver { public: MessageReceiverEx(); ~MessageReceiverEx() override; - bool m1(void*) override; - void m2(void* x) override; + int receive(const Message& message) override; + void receive(const MessageAck& ack) override; bool checkFlag() const; bool checkCounter() const; @@ -23,8 +23,8 @@ public: SEAD_RTTI_BASE(MessageReceiverEx) protected: - virtual bool m6(void* x); - virtual void m7(void* x); + virtual int handleMessage(const Message& message); + virtual void handleAck(const MessageAck& ack); private: u8* mFlag{};