ksys: Add Message class

This commit is contained in:
Léo Lam 2021-01-31 14:12:10 +01:00
parent d6ee0c9183
commit 176d687698
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
5 changed files with 150 additions and 19 deletions

View File

@ -88834,20 +88834,20 @@
0x00000071010bf9d0,sub_71010BF9D0,16,
0x00000071010bf9e0,DualHeap::rtti1,288,
0x00000071010bfb00,DualHeap::rtti2,92,
0x00000071010bfb5c,GlobalMessage::sc::ctor,68,
0x00000071010bfba0,sub_71010BFBA0,132,
0x00000071010bfc24,sub_71010BFC24,104,
0x00000071010bfc8c,sub_71010BFC8C,36,
0x00000071010bfcb0,j__ZdlPv_1194,4,
0x00000071010bfcb4,sub_71010BFCB4,8,
0x00000071010bfcbc,sub_71010BFCBC,8,
0x00000071010bfcc4,sub_71010BFCC4,8,
0x00000071010bfccc,sub_71010BFCCC,8,
0x00000071010bfcd4,sub_71010BFCD4,8,
0x00000071010bfcdc,sub_71010BFCDC,44,
0x00000071010bfd08,sub_71010BFD08,8,
0x00000071010bfd10,sub_71010BFD10,36,
0x00000071010bfd34,sub_71010BFD34,12,
0x00000071010bfb5c,GlobalMessage::sc::ctor,68,_ZN4ksys7MessageC1Ev
0x00000071010bfba0,sub_71010BFBA0,132,_ZN4ksys7MessageC1ERKNS_16MesTransceiverIdES3_RKNS_11MessageTypeEPvRKNS0_11DelayParamsEb
0x00000071010bfc24,sub_71010BFC24,104,_ZN4ksys7MessageC1ERKNS_16MesTransceiverIdERKNS_11MessageTypeEPvRKNS0_11DelayParamsEb
0x00000071010bfc8c,sub_71010BFC8C,36,_ZN4ksys7MessageD1Ev
0x00000071010bfcb0,j__ZdlPv_1194,4,_ZN4ksys7MessageD0Ev
0x00000071010bfcb4,sub_71010BFCB4,8,_ZNK4ksys7Message9getSourceEv
0x00000071010bfcbc,sub_71010BFCBC,8,_ZNK4ksys7Message14getDestinationEv
0x00000071010bfcc4,sub_71010BFCC4,8,_ZNK4ksys7Message7getTypeEv
0x00000071010bfccc,sub_71010BFCCC,8,_ZNK4ksys7Message11getUserDataEv
0x00000071010bfcd4,sub_71010BFCD4,8,_ZNK4ksys7Message10getField48Ev
0x00000071010bfcdc,sub_71010BFCDC,44,_ZNK4ksys7Message17shouldBeProcessedEv
0x00000071010bfd08,sub_71010BFD08,8,_ZNK4ksys7Message10getField60Ev
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
@ -92681,7 +92681,7 @@
0x00000071011f6474,sub_71011F6474,8,
0x00000071011f647c,sub_71011F647C,204,
0x00000071011f6548,sub_71011F6548,92,
0x00000071011f65a4,getGlobalMessagePtr,36,_ZN4ksys22MessageTransceiverBaseC1Ev
0x00000071011f65a4,getGlobalMessagePtr,36,_ZN4ksys22MessageTransceiverBaseC2Ev
0x00000071011f65c8,nullsub_4673,4,_ZN4ksys22MessageTransceiverBaseD1Ev
0x00000071011f65cc,j__ZdlPv_1225,4,_ZN4ksys22MessageTransceiverBaseD0Ev
0x00000071011f65d0,sub_71011F65D0,28,_ZNK4ksys22MessageTransceiverBase18checkGeneratorFlagEv

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

View File

@ -7,6 +7,8 @@ target_sources(uking PRIVATE
Thread/ManagedTask.h
Thread/ManagedTaskHandle.cpp
Thread/ManagedTaskHandle.h
Thread/Message.cpp
Thread/Message.h
Thread/MessageDispatcherBase.cpp
Thread/MessageDispatcherBase.h
Thread/MessageReceiver.cpp

View File

@ -0,0 +1,61 @@
#include "KingSystem/Utils/Thread/Message.h"
namespace ksys {
Message::Message() = default;
Message::Message(const MesTransceiverId& source, const MesTransceiverId& destination,
const MessageType& type, void* user_data, const Message::DelayParams& delay_params,
bool x)
: mSource(source), mDestination(destination), mType(type), mUserData(user_data),
mDelayParams(delay_params), _60(x) {}
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) {}
Message::~Message() = default;
const MesTransceiverId& Message::getSource() const {
return mSource;
}
const MesTransceiverId& Message::getDestination() const {
return mDestination;
}
const MessageType& Message::getType() const {
return mType;
}
void* Message::getUserData() const {
return mUserData;
}
u32 Message::getField48() const {
return _48;
}
bool Message::shouldBeProcessed() const {
if (mDelayParams.delay_ticks != 0)
return false;
if (!mDelayParams.delayer)
return true;
return mDelayParams.delayer->shouldProcessMessage();
}
bool Message::getField60() const {
return _60;
}
void Message::setDestination(const MesTransceiverId& dest) {
mDestination = dest;
}
void Message::setField48(const u32& v) {
_48 = v;
}
} // namespace ksys

View File

@ -0,0 +1,67 @@
#pragma once
#include <basis/seadTypes.h>
#include "KingSystem/Utils/Thread/MessageTransceiverId.h"
namespace ksys {
struct MessageType {
MessageType() = default;
MessageType(u32 v) : value(v) {} // NOLINT(google-explicit-constructor)
u32 value;
};
class MessageDelayer {
public:
MessageDelayer() = default;
virtual ~MessageDelayer() = default;
virtual bool shouldProcessMessage() = 0;
};
class Message {
public:
struct DelayParams {
DelayParams() : delay_ticks(), delayer() {}
DelayParams(const DelayParams& other) { *this = other; }
// Yes, this operator is quite pointless, but we need it to match.
DelayParams& operator=(const DelayParams& other) {
delay_ticks = other.delay_ticks;
delayer = other.delayer;
return *this;
}
int delay_ticks;
MessageDelayer* delayer;
};
Message();
Message(const MesTransceiverId& source, const MesTransceiverId& destination,
const MessageType& type, void* user_data, const DelayParams& delay_params, bool x);
Message(const MesTransceiverId& source, const MessageType& type, void* user_data,
const DelayParams& delay_params, bool x);
virtual ~Message();
virtual const MesTransceiverId& getSource() const;
virtual const MesTransceiverId& getDestination() const;
virtual const MessageType& getType() const;
virtual void* getUserData() const;
virtual u32 getField48() const;
virtual bool getField60() const;
virtual void setDestination(const MesTransceiverId& dest);
virtual void setField48(const u32& v);
virtual bool shouldBeProcessed() const;
private:
MesTransceiverId mSource{};
MesTransceiverId mDestination{};
MessageType mType{};
void* mUserData{};
u32 _48 = 0xffffffff;
DelayParams mDelayParams{};
bool _60 = true;
};
} // namespace ksys

View File

@ -9,8 +9,9 @@ namespace ksys {
class MessageReceiver;
struct MesTransceiverId {
MesTransceiverId() { reset(); }
MesTransceiverId(u32& id, MessageReceiver* receiver) : id(++id), receiver(receiver) {}
MesTransceiverId() : receiver(), next() { reset(); }
MesTransceiverId(const MesTransceiverId& other) { *this = other; }
MesTransceiverId(u32& id, MessageReceiver* receiver) : id(++id), receiver(receiver), next() {}
~MesTransceiverId() { reset(); }
void reset() {
@ -30,8 +31,8 @@ struct MesTransceiverId {
u32 queue_id = 0xffffffff;
u32 id = 0xffffffff;
MessageReceiver* receiver{};
MesTransceiverId** next{};
MessageReceiver* receiver;
MesTransceiverId** next;
};
KSYS_CHECK_SIZE_NX150(MesTransceiverId, 0x18);