diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 6b0c5f3f..9b62a8be 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -92643,10 +92643,10 @@ 0x00000071011f501c,GlobalMessage::currentTlsSlotIsSame,56,_ZNK4ksys17MessageDispatcher27isProcessingOnCurrentThreadEv 0x00000071011f5054,GlobalMessage::x,376,_ZN4ksys17MessageDispatcher19registerTransceiverERNS_17MessageReceiverExE 0x00000071011f51cc,GlobalMessage::x_0,344,_ZN4ksys17MessageDispatcher21deregisterTransceiverERNS_17MessageReceiverExE -0x00000071011f5324,GlobalMessage::x_1,124,_ZN4ksys17MessageDispatcher11sendMessageERKNS_16MesTransceiverIdES3_RKNS_11MessageTypeEPvb -0x00000071011f53a0,GlobalMessage::x_5,236,_ZN4ksys17MessageDispatcher29sendMessageOnProcessingThreadERKNS_16MesTransceiverIdES3_RKNS_11MessageTypeEPvb? -0x00000071011f548c,GlobalMessage::x_2,208,_ZN4ksys17MessageDispatcher11sendMessageERKNS_16MesTransceiverIdERNS_22IMessageBrokerRegisterERKNS_11MessageTypeEPvb -0x00000071011f555c,GlobalMessage::x_3,268,_ZN4ksys17MessageDispatcher29sendMessageOnProcessingThreadERKNS_16MesTransceiverIdERNS_22IMessageBrokerRegisterERKNS_11MessageTypeEPvb +0x00000071011f5324,GlobalMessage::x_1,124,_ZN4ksys17MessageDispatcher11sendMessageERKNS_16MesTransceiverIdES3_RKNS_11MessageTypeEPvbb +0x00000071011f53a0,GlobalMessage::x_5,236,_ZN4ksys17MessageDispatcher29sendMessageOnProcessingThreadERKNS_16MesTransceiverIdES3_RKNS_11MessageTypeEPvbb? +0x00000071011f548c,GlobalMessage::x_2,208,_ZN4ksys17MessageDispatcher11sendMessageERKNS_16MesTransceiverIdERNS_22IMessageBrokerRegisterERKNS_11MessageTypeEPvbb +0x00000071011f555c,GlobalMessage::x_3,268,_ZN4ksys17MessageDispatcher29sendMessageOnProcessingThreadERKNS_16MesTransceiverIdERNS_22IMessageBrokerRegisterERKNS_11MessageTypeEPvbb 0x00000071011f5668,GlobalMessage::x_4,248,_ZN4ksys17MessageDispatcher6updateEv? 0x00000071011f5760,GlobalMessage::rtti1,204,_ZNK4ksys17MessageDispatcher27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE 0x00000071011f582c,GlobalMessage::rtti2,92,_ZNK4ksys17MessageDispatcher18getRuntimeTypeInfoEv @@ -92668,19 +92668,19 @@ 0x00000071011f5f6c,GlobalMessage::setGlobalPtr,4,_ZN4ksys21MessageDispatcherBase19setAsGlobalInstanceEv 0x00000071011f5f70,sub_71011F5F70,112,_ZNK4ksys21MessageDispatcherBase27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE 0x00000071011f5fe0,sub_71011F5FE0,92,_ZNK4ksys21MessageDispatcherBase18getRuntimeTypeInfoEv -0x00000071011f603c,j_j_Struct1A::dtor_0,4, -0x00000071011f6040,sub_71011F6040,36, -0x00000071011f6064,sub_71011F6064,16, -0x00000071011f6074,GlobalMessageReceiver::ctor,128, -0x00000071011f60f4,sub_71011F60F4,80, -0x00000071011f6144,sub_71011F6144,88, -0x00000071011f619c,sub_71011F619C,156, -0x00000071011f6238,sub_71011F6238,156, -0x00000071011f62d4,sub_71011F62D4,208, -0x00000071011f63a4,sub_71011F63A4,208, -0x00000071011f6474,sub_71011F6474,8, -0x00000071011f647c,sub_71011F647C,204, -0x00000071011f6548,sub_71011F6548,92, +0x00000071011f603c,j_j_Struct1A::dtor_0,4,_ZN4ksys24MessageTransceiverTxOnly8ReceiverD1Ev +0x00000071011f6040,sub_71011F6040,36,_ZN4ksys24MessageTransceiverTxOnly8ReceiverD0Ev +0x00000071011f6064,sub_71011F6064,16,_ZN4ksys24MessageTransceiverTxOnly8Receiver9handleAckERKNS_10MessageAckE +0x00000071011f6074,GlobalMessageReceiver::ctor,128,_ZN4ksys24MessageTransceiverTxOnlyC1ERNS0_8IHandlerE +0x00000071011f60f4,sub_71011F60F4,80,_ZN4ksys24MessageTransceiverTxOnlyD1Ev +0x00000071011f6144,sub_71011F6144,88,_ZN4ksys24MessageTransceiverTxOnlyD0Ev +0x00000071011f619c,sub_71011F619C,156,_ZN4ksys24MessageTransceiverTxOnly11sendMessageERKNS_16MesTransceiverIdERKNS_11MessageTypeEPvb +0x00000071011f6238,sub_71011F6238,156,_ZN4ksys24MessageTransceiverTxOnly29sendMessageOnProcessingThreadERKNS_16MesTransceiverIdERKNS_11MessageTypeEPvb +0x00000071011f62d4,sub_71011F62D4,208,_ZN4ksys24MessageTransceiverTxOnly11sendMessageERNS_14IMessageBrokerERKNS_11MessageTypeEPvb +0x00000071011f63a4,sub_71011F63A4,208,_ZN4ksys24MessageTransceiverTxOnly29sendMessageOnProcessingThreadERNS_14IMessageBrokerERKNS_11MessageTypeEPvb +0x00000071011f6474,sub_71011F6474,8,_ZN4ksys24MessageTransceiverTxOnly11getReceiverEv +0x00000071011f647c,sub_71011F647C,204,_ZNK4ksys24MessageTransceiverTxOnly8Receiver27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071011f6548,sub_71011F6548,92,_ZNK4ksys24MessageTransceiverTxOnly8Receiver18getRuntimeTypeInfoEv 0x00000071011f65a4,getGlobalMessagePtr,36,_ZN4ksys22MessageTransceiverBaseC2Ev 0x00000071011f65c8,nullsub_4673,4,_ZN4ksys22MessageTransceiverBaseD1Ev 0x00000071011f65cc,j__ZdlPv_1225,4,_ZN4ksys22MessageTransceiverBaseD0Ev diff --git a/src/KingSystem/Utils/CMakeLists.txt b/src/KingSystem/Utils/CMakeLists.txt index a3d00caa..226992f0 100644 --- a/src/KingSystem/Utils/CMakeLists.txt +++ b/src/KingSystem/Utils/CMakeLists.txt @@ -27,10 +27,13 @@ target_sources(uking PRIVATE Thread/MessageReceiverEx.h Thread/MessageTransceiverBase.cpp Thread/MessageTransceiverBase.h + Thread/MessageTransceiverCommon.h Thread/MessageTransceiverId.cpp Thread/MessageTransceiverId.h Thread/MessageTransceiverRxOnly.cpp Thread/MessageTransceiverRxOnly.h + Thread/MessageTransceiverTxOnly.cpp + Thread/MessageTransceiverTxOnly.h Thread/Task.cpp Thread/Task.h Thread/TaskData.h diff --git a/src/KingSystem/Utils/Thread/MessageDispatcher.cpp b/src/KingSystem/Utils/Thread/MessageDispatcher.cpp index b1bdcf24..c6c2baad 100644 --- a/src/KingSystem/Utils/Thread/MessageDispatcher.cpp +++ b/src/KingSystem/Utils/Thread/MessageDispatcher.cpp @@ -222,7 +222,7 @@ void MessageDispatcher::deregisterTransceiver(MessageReceiverEx& receiver) { } bool MessageDispatcher::sendMessage(const MesTransceiverId& src, const MesTransceiverId& dest, - const MessageType& type, void* user_data, bool ack) { + const MessageType& type, void* user_data, bool ack, bool) { auto* queues = mQueues; const auto message = Message{src, dest, type, user_data, {}, ack}; const auto lock = sead::makeScopedLock(queues->getCritSection()); @@ -243,7 +243,7 @@ bool MessageDispatcher::Queues::sendMessageOnProcessingThread(const MesTransceiv bool MessageDispatcher::sendMessageOnProcessingThread(const MesTransceiverId& src, const MesTransceiverId& dest, const MessageType& type, void* user_data, - bool ack) { + bool ack, bool) { if (!isProcessingOnCurrentThread()) return false; return mQueues->sendMessageOnProcessingThread(src, dest, type, user_data, ack); @@ -265,7 +265,7 @@ struct AddMessageContext : IMessageBrokerRegister::IForEachContext { }; bool MessageDispatcher::sendMessage(const MesTransceiverId& src, IMessageBrokerRegister& reg, - const MessageType& type, void* user_data, bool ack) { + const MessageType& type, void* user_data, bool ack, bool) { auto queues = mQueues; Message::DelayParams delay_params; // This should probably be a Queues member function, but putting this here removes @@ -301,7 +301,7 @@ struct AddMessageMainContext : IMessageBrokerRegister::IForEachContext { bool MessageDispatcher::sendMessageOnProcessingThread(const MesTransceiverId& src, IMessageBrokerRegister& reg, const MessageType& type, void* user_data, - bool ack) { + bool ack, bool) { if (!isProcessingOnCurrentThread()) return false; diff --git a/src/KingSystem/Utils/Thread/MessageDispatcher.h b/src/KingSystem/Utils/Thread/MessageDispatcher.h index 7277a471..d8867c9f 100644 --- a/src/KingSystem/Utils/Thread/MessageDispatcher.h +++ b/src/KingSystem/Utils/Thread/MessageDispatcher.h @@ -58,13 +58,15 @@ public: void registerTransceiver(MessageReceiverEx& receiver) override; void deregisterTransceiver(MessageReceiverEx& receiver) override; bool sendMessage(const MesTransceiverId& src, const MesTransceiverId& dest, - const MessageType& type, void* user_data, bool ack) override; + const MessageType& type, void* user_data, bool ack, bool) override; bool sendMessageOnProcessingThread(const MesTransceiverId& src, const MesTransceiverId& dest, - const MessageType& type, void* user_data, bool ack) override; + const MessageType& type, void* user_data, bool ack, + bool) override; bool sendMessage(const MesTransceiverId& src, IMessageBrokerRegister& reg, - const MessageType& type, void* user_data, bool ack) override; + const MessageType& type, void* user_data, bool ack, bool) override; bool sendMessageOnProcessingThread(const MesTransceiverId& src, IMessageBrokerRegister& reg, - const MessageType& type, void* user_data, bool ack) override; + const MessageType& type, void* user_data, bool ack, + bool) override; void update() override; private: diff --git a/src/KingSystem/Utils/Thread/MessageDispatcherBase.h b/src/KingSystem/Utils/Thread/MessageDispatcherBase.h index 5d59bc46..e9fadb14 100644 --- a/src/KingSystem/Utils/Thread/MessageDispatcherBase.h +++ b/src/KingSystem/Utils/Thread/MessageDispatcherBase.h @@ -18,16 +18,16 @@ public: virtual void registerTransceiver(MessageReceiverEx& receiver) = 0; virtual void deregisterTransceiver(MessageReceiverEx& receiver) = 0; virtual bool sendMessage(const MesTransceiverId& src, const MesTransceiverId& dest, - const MessageType& type, void* user_data, bool ack) = 0; + const MessageType& type, void* user_data, bool ack, bool) = 0; virtual bool sendMessageOnProcessingThread(const MesTransceiverId& src, const MesTransceiverId& dest, - const MessageType& type, void* user_data, - bool ack) = 0; + const MessageType& type, void* user_data, bool ack, + bool) = 0; virtual bool sendMessage(const MesTransceiverId& src, IMessageBrokerRegister& reg, - const MessageType& type, void* user_data, bool ack) = 0; + const MessageType& type, void* user_data, bool ack, bool) = 0; virtual bool sendMessageOnProcessingThread(const MesTransceiverId& src, IMessageBrokerRegister& reg, const MessageType& type, - void* user_data, bool ack) = 0; + void* user_data, bool ack, bool) = 0; virtual void update() = 0; protected: diff --git a/src/KingSystem/Utils/Thread/MessageReceiver.h b/src/KingSystem/Utils/Thread/MessageReceiver.h index f3533eb1..640a6cd6 100644 --- a/src/KingSystem/Utils/Thread/MessageReceiver.h +++ b/src/KingSystem/Utils/Thread/MessageReceiver.h @@ -12,7 +12,7 @@ class MessageReceiver { public: MessageReceiver(); virtual ~MessageReceiver(); - virtual MesTransceiverId* getId(); + virtual MesTransceiverId* getId() final; virtual int receive(const Message& message); virtual void receive(const MessageAck& ack); virtual void setQueueId(const u32& id) { mTransceiverId.queue_id = id; } diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverBase.h b/src/KingSystem/Utils/Thread/MessageTransceiverBase.h index 6869bc20..8cfd32a0 100644 --- a/src/KingSystem/Utils/Thread/MessageTransceiverBase.h +++ b/src/KingSystem/Utils/Thread/MessageTransceiverBase.h @@ -35,7 +35,7 @@ public: protected: void registerReceiver(MessageReceiverEx& receiver) { getDispatcher()->registerTransceiver(receiver); - mId = receiver.MessageReceiver::getId(); + mId = receiver.getId(); } void deregisterReceiver(MessageReceiverEx& receiver) { diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverCommon.h b/src/KingSystem/Utils/Thread/MessageTransceiverCommon.h new file mode 100644 index 00000000..798a355e --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageTransceiverCommon.h @@ -0,0 +1,66 @@ +#pragma once + +#include "KingSystem/Utils/Thread/MessageBroker.h" +#include "KingSystem/Utils/Thread/MessageDispatcherBase.h" + +namespace ksys { + +template +bool sendMessageImpl(T* transceiver, const MesTransceiverId& dest, const MessageType& type, + void* user_data, bool ack) { + MessageDispatcherBase* dispatcher = transceiver->getDispatcher(); + const bool ok = dispatcher->sendMessage(*transceiver->getReceiver()->getId(), dest, type, + user_data, ack, false); + + if (ok) + transceiver->getReceiver()->setFlag(ack); + + return ok; +} + +template +bool sendMessageOnProcessingThreadImpl(T* transceiver, const MesTransceiverId& dest, + const MessageType& type, void* user_data, bool ack) { + MessageDispatcherBase* dispatcher = transceiver->getDispatcher(); + const bool ok = dispatcher->sendMessageOnProcessingThread(*transceiver->getReceiver()->getId(), + dest, type, user_data, ack, false); + + if (ok) + transceiver->getReceiver()->setFlag(ack); + + return ok; +} + +template +bool sendMessageImpl(T* transceiver, IMessageBroker& broker, const MessageType& type, + void* user_data, bool ack) { + MessageDispatcherBase* dispatcher = transceiver->getDispatcher(); + const bool ok = + dispatcher->sendMessage(*transceiver->getReceiver()->getId(), + *transceiver->getRegister(broker), type, user_data, ack, false); + + if (ok) { + for (int i = 0, n = broker.countTransceivers(); i < n; ++i) + transceiver->getReceiver()->setFlag(ack); + } + + return ok; +} + +template +bool sendMessageOnProcessingThreadImpl(T* transceiver, IMessageBroker& broker, + const MessageType& type, void* user_data, bool ack) { + MessageDispatcherBase* dispatcher = transceiver->getDispatcher(); + const bool ok = dispatcher->sendMessageOnProcessingThread(*transceiver->getReceiver()->getId(), + *transceiver->getRegister(broker), + type, user_data, ack, false); + + if (ok) { + for (int i = 0, n = broker.countTransceivers(); i < n; ++i) + transceiver->getReceiver()->setFlag(ack); + } + + return ok; +} + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverTxOnly.cpp b/src/KingSystem/Utils/Thread/MessageTransceiverTxOnly.cpp new file mode 100644 index 00000000..7cbd11b9 --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageTransceiverTxOnly.cpp @@ -0,0 +1,46 @@ +#include "KingSystem/Utils/Thread/MessageTransceiverTxOnly.h" +#include "KingSystem/Utils/Thread/MessageTransceiverCommon.h" + +namespace ksys { + +MessageTransceiverTxOnly::MessageTransceiverTxOnly(IHandler& handler) : mReceiver(handler) { + registerReceiver(mReceiver); +} + +MessageTransceiverTxOnly::~MessageTransceiverTxOnly() { + deregisterReceiver(mReceiver); +} + +MessageReceiverEx* MessageTransceiverTxOnly::getReceiver() { + return &mReceiver; +} + +bool MessageTransceiverTxOnly::sendMessage(const MesTransceiverId& dest, const MessageType& type, + void* user_data, bool ack) { + return sendMessageImpl(this, dest, type, user_data, ack); +} + +bool MessageTransceiverTxOnly::sendMessageOnProcessingThread(const MesTransceiverId& dest, + const MessageType& type, + void* user_data, bool ack) { + return sendMessageOnProcessingThreadImpl(this, dest, type, user_data, ack); +} + +bool MessageTransceiverTxOnly::sendMessage(IMessageBroker& broker, const MessageType& type, + void* user_data, bool ack) { + return sendMessageImpl(this, broker, type, user_data, ack); +} + +bool MessageTransceiverTxOnly::sendMessageOnProcessingThread(IMessageBroker& broker, + const MessageType& type, + void* user_data, bool ack) { + return sendMessageOnProcessingThreadImpl(this, broker, type, user_data, ack); +} + +MessageTransceiverTxOnly::Receiver::~Receiver() = default; + +void MessageTransceiverTxOnly::Receiver::handleAck(const MessageAck& ack) { + mHandler.handleAck(ack); +} + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverTxOnly.h b/src/KingSystem/Utils/Thread/MessageTransceiverTxOnly.h new file mode 100644 index 00000000..28b17e1b --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageTransceiverTxOnly.h @@ -0,0 +1,45 @@ +#pragma once + +#include "KingSystem/Utils/Thread/MessageReceiverEx.h" +#include "KingSystem/Utils/Thread/MessageTransceiverBase.h" + +namespace ksys { + +class Message; + +class MessageTransceiverTxOnly final : public MessageTransceiverBase { +public: + class IHandler { + public: + virtual ~IHandler() = default; + virtual void handleAck(const MessageAck& ack) = 0; + }; + + explicit MessageTransceiverTxOnly(IHandler& handler); + ~MessageTransceiverTxOnly() 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) : mHandler(handler) {} + ~Receiver() override; + void handleAck(const MessageAck& ack) override; + + private: + IHandler& mHandler; + }; + + Receiver mReceiver; +}; + +} // namespace ksys