ksys: Add MessageTransceiverTxOnly

This commit is contained in:
Léo Lam
2021-02-05 01:20:18 +01:00
parent 96612361e6
commit f861dcaec3
10 changed files with 194 additions and 32 deletions
+17 -17
View File
@@ -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
Can't render this file because it is too large.
+3
View File
@@ -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
@@ -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;
@@ -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:
@@ -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:
@@ -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; }
@@ -35,7 +35,7 @@ public:
protected:
void registerReceiver(MessageReceiverEx& receiver) {
getDispatcher()->registerTransceiver(receiver);
mId = receiver.MessageReceiver::getId();
mId = receiver.getId();
}
void deregisterReceiver(MessageReceiverEx& receiver) {
@@ -0,0 +1,66 @@
#pragma once
#include "KingSystem/Utils/Thread/MessageBroker.h"
#include "KingSystem/Utils/Thread/MessageDispatcherBase.h"
namespace ksys {
template <class T>
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 <class T>
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 <class T>
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 <class T>
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
@@ -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
@@ -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