ksys: Add MessageProcessor

This commit is contained in:
Léo Lam 2021-01-31 15:39:44 +01:00
parent 176d687698
commit 8ac6752866
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
14 changed files with 213 additions and 55 deletions

View File

@ -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,

Can't render this file because it is too large.

View File

@ -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

View File

@ -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) {

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,59 @@
#include "KingSystem/Utils/Thread/MessageProcessor.h"
#include <tuple>
#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

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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<void>(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) {

View File

@ -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{};