mirror of
https://github.com/zeldaret/botw
synced 2026-07-11 14:38:41 -04:00
ksys: Add MessageTransceiverTxOnly
This commit is contained in:
+17
-17
@@ -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.
|
@@ -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
|
||||
Reference in New Issue
Block a user