ksys: Add ActorMessageTransceiver

This commit is contained in:
Léo Lam 2021-02-05 18:10:37 +01:00
parent c2426371f7
commit d5b981a233
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
6 changed files with 142 additions and 23 deletions

View File

@ -88895,21 +88895,21 @@
0x00000071010c02ec,sub_71010C02EC,204,_ZNK4ksys22MessageReceiverAdapter27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x00000071010c03b8,sub_71010C03B8,92,_ZNK4ksys22MessageReceiverAdapter18getRuntimeTypeInfoEv
0x00000071010c0414,sub_71010C0414,140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys17MessageReceiverExEE9isDerivedEPKNS0_9InterfaceE
0x00000071010c04a0,j_j_Struct1A::dtor,4,
0x00000071010c04a4,sub_71010C04A4,36,
0x00000071010c04c8,sub_71010C04C8,16,
0x00000071010c04d8,sub_71010C04D8,16,
0x00000071010c04e8,sub_71010C04E8,128,
0x00000071010c0568,sub_71010C0568,132,
0x00000071010c05ec,sub_71010C05EC,80,
0x00000071010c063c,sub_71010C063C,88,
0x00000071010c0694,MessageSender::sendMaybe,188,
0x00000071010c0750,sub_71010C0750,188,
0x00000071010c080c,sub_71010C080C,236,
0x00000071010c08f8,sub_71010C08F8,236,
0x00000071010c09e4,sub_71010C09E4,8,
0x00000071010c09ec,sub_71010C09EC,204,
0x00000071010c0ab8,sub_71010C0AB8,92,
0x00000071010c04a0,j_j_Struct1A::dtor,4,_ZN4ksys23ActorMessageTransceiver8ReceiverD1Ev
0x00000071010c04a4,sub_71010C04A4,36,_ZN4ksys23ActorMessageTransceiver8ReceiverD0Ev
0x00000071010c04c8,sub_71010C04C8,16,_ZN4ksys23ActorMessageTransceiver8Receiver13handleMessageERKNS_7MessageE
0x00000071010c04d8,sub_71010C04D8,16,_ZN4ksys23ActorMessageTransceiver8Receiver9handleAckERKNS_10MessageAckE
0x00000071010c04e8,sub_71010C04E8,128,_ZN4ksys23ActorMessageTransceiverC1ERNS0_8IHandlerE
0x00000071010c0568,sub_71010C0568,132,_ZN4ksys23ActorMessageTransceiverC1ERNS0_8IHandlerEPNS_3act5ActorE
0x00000071010c05ec,sub_71010C05EC,80,_ZN4ksys23ActorMessageTransceiverD1Ev
0x00000071010c063c,sub_71010C063C,88,_ZN4ksys23ActorMessageTransceiverD0Ev
0x00000071010c0694,MessageSender::sendMaybe,188,_ZN4ksys23ActorMessageTransceiver11sendMessageERKNS_16MesTransceiverIdERKNS_11MessageTypeEPvb
0x00000071010c0750,sub_71010C0750,188,_ZN4ksys23ActorMessageTransceiver29sendMessageOnProcessingThreadERKNS_16MesTransceiverIdERKNS_11MessageTypeEPvb
0x00000071010c080c,sub_71010C080C,236,_ZN4ksys23ActorMessageTransceiver11sendMessageERNS_14IMessageBrokerERKNS_11MessageTypeEPvb
0x00000071010c08f8,sub_71010C08F8,236,_ZN4ksys23ActorMessageTransceiver29sendMessageOnProcessingThreadERNS_14IMessageBrokerERKNS_11MessageTypeEPvb
0x00000071010c09e4,sub_71010C09E4,8,_ZN4ksys23ActorMessageTransceiver11getReceiverEv
0x00000071010c09ec,sub_71010C09EC,204,_ZNK4ksys23ActorMessageTransceiver8Receiver27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x00000071010c0ab8,sub_71010C0AB8,92,_ZNK4ksys23ActorMessageTransceiver8Receiver18getRuntimeTypeInfoEv
0x00000071010c0b14,Event::ctorEvent,32,_ZN4ksys4util5EventC1Ev
0x00000071010c0b34,Event::ctorDisposer,32,_ZN4ksys4util5EventC1EPN4sead4HeapE
0x00000071010c0b54,Event::ctorEvent2,36,_ZN4ksys4util5EventC1Eb

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

View File

@ -33,6 +33,7 @@ public:
_18 = 0x18,
_25 = 0x25,
_2b = 0x2b,
_2e = 0x2e,
};
enum class DeleteType {

View File

@ -1,4 +1,6 @@
target_sources(uking PRIVATE
Thread/ActorMessageTransceiver.cpp
Thread/ActorMessageTransceiver.h
Thread/Event.cpp
Thread/Event.h
Thread/GameTaskThread.cpp

View File

@ -0,0 +1,62 @@
#include "KingSystem/Utils/Thread/ActorMessageTransceiver.h"
#include "KingSystem/ActorSystem/actActor.h"
#include "KingSystem/Utils/Thread/MessageTransceiverCommon.h"
namespace ksys {
ActorMessageTransceiver::ActorMessageTransceiver(IHandler& handler) : mReceiver(handler) {
registerReceiver(mReceiver);
}
ActorMessageTransceiver::ActorMessageTransceiver(IHandler& handler, act::Actor* actor)
: mReceiver(handler), mActor(actor) {
registerReceiver(mReceiver);
}
ActorMessageTransceiver::~ActorMessageTransceiver() {
deregisterReceiver(mReceiver);
}
bool ActorMessageTransceiver::getDebugArg(bool ack) const {
return mActor && mActor->checkFlag(act::Actor::ActorFlag::_2e) && ack;
}
bool ActorMessageTransceiver::sendMessage(const MesTransceiverId& dest, const MessageType& type,
void* user_data, bool ack) {
return sendMessageImpl(this, dest, type, user_data, ack, getDebugArg(ack));
}
bool ActorMessageTransceiver::sendMessageOnProcessingThread(const MesTransceiverId& dest,
const MessageType& type,
void* user_data, bool ack) {
return sendMessageOnProcessingThreadImpl(this, dest, type, user_data, ack, getDebugArg(ack));
}
bool ActorMessageTransceiver::sendMessage(IMessageBroker& broker, const MessageType& type,
void* user_data, bool ack) {
return sendMessageImpl(this, broker, type, user_data, ack, getDebugArg(ack));
}
bool ActorMessageTransceiver::sendMessageOnProcessingThread(IMessageBroker& broker,
const MessageType& type,
void* user_data, bool ack) {
return sendMessageOnProcessingThreadImpl(this, broker, type, user_data, ack, getDebugArg(ack));
}
MessageReceiverEx* ActorMessageTransceiver::getReceiver() {
return &mReceiver;
}
ActorMessageTransceiver::Receiver::Receiver(IHandler& handler) : mHandler(handler) {}
ActorMessageTransceiver::Receiver::~Receiver() = default;
int ActorMessageTransceiver::Receiver::handleMessage(const Message& message) {
return mHandler.handleMessage(message);
}
void ActorMessageTransceiver::Receiver::handleAck(const MessageAck& ack) {
return mHandler.handleAck(ack);
}
} // namespace ksys

View File

@ -0,0 +1,52 @@
#pragma once
#include "KingSystem/Utils/Thread/MessageTransceiverBase.h"
#include "KingSystem/Utils/Thread/MessageTransceiverRxOnly.h"
#include "KingSystem/Utils/Thread/MessageTransceiverTxOnly.h"
namespace ksys {
namespace act {
class Actor;
}
class ActorMessageTransceiver final : public MessageTransceiverBase {
public:
class IHandler : public MessageTransceiverRxOnly::IHandler,
public MessageTransceiverTxOnly::IHandler {};
KSYS_CHECK_SIZE_NX150(IHandler, 0x10);
explicit ActorMessageTransceiver(IHandler& handler);
explicit ActorMessageTransceiver(IHandler& handler, act::Actor* actor);
~ActorMessageTransceiver() 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);
~Receiver() override;
int handleMessage(const Message& message) override;
void handleAck(const MessageAck& ack) override;
private:
IHandler& mHandler;
};
// TODO: rename if we figure out what this is used for
bool getDebugArg(bool ack) const;
Receiver mReceiver;
act::Actor* mActor{};
};
} // namespace ksys

View File

@ -7,10 +7,10 @@ namespace ksys {
template <class T>
bool sendMessageImpl(T* transceiver, const MesTransceiverId& dest, const MessageType& type,
void* user_data, bool ack) {
void* user_data, bool ack, bool x = false) {
MessageDispatcherBase* dispatcher = transceiver->getDispatcher();
const bool ok = dispatcher->sendMessage(*transceiver->getReceiver()->MessageReceiver::getId(),
dest, type, user_data, ack, false);
dest, type, user_data, ack, x);
if (ok)
transceiver->getReceiver()->setFlag(ack);
@ -20,10 +20,11 @@ bool sendMessageImpl(T* transceiver, const MesTransceiverId& dest, const Message
template <class T>
bool sendMessageOnProcessingThreadImpl(T* transceiver, const MesTransceiverId& dest,
const MessageType& type, void* user_data, bool ack) {
const MessageType& type, void* user_data, bool ack,
bool x = false) {
MessageDispatcherBase* dispatcher = transceiver->getDispatcher();
const bool ok = dispatcher->sendMessageOnProcessingThread(
*transceiver->getReceiver()->MessageReceiver::getId(), dest, type, user_data, ack, false);
*transceiver->getReceiver()->MessageReceiver::getId(), dest, type, user_data, ack, x);
if (ok)
transceiver->getReceiver()->setFlag(ack);
@ -33,11 +34,11 @@ bool sendMessageOnProcessingThreadImpl(T* transceiver, const MesTransceiverId& d
template <class T>
bool sendMessageImpl(T* transceiver, IMessageBroker& broker, const MessageType& type,
void* user_data, bool ack) {
void* user_data, bool ack, bool x = false) {
MessageDispatcherBase* dispatcher = transceiver->getDispatcher();
const bool ok =
dispatcher->sendMessage(*transceiver->getReceiver()->MessageReceiver::getId(),
*transceiver->getRegister(broker), type, user_data, ack, false);
*transceiver->getRegister(broker), type, user_data, ack, x);
if (ok) {
for (int i = 0, n = broker.countTransceivers(); i < n; ++i)
@ -49,11 +50,12 @@ bool sendMessageImpl(T* transceiver, IMessageBroker& broker, const MessageType&
template <class T>
bool sendMessageOnProcessingThreadImpl(T* transceiver, IMessageBroker& broker,
const MessageType& type, void* user_data, bool ack) {
const MessageType& type, void* user_data, bool ack,
bool x = false) {
MessageDispatcherBase* dispatcher = transceiver->getDispatcher();
const bool ok = dispatcher->sendMessageOnProcessingThread(
*transceiver->getReceiver()->MessageReceiver::getId(), *transceiver->getRegister(broker),
type, user_data, ack, false);
type, user_data, ack, x);
if (ok) {
for (int i = 0, n = broker.countTransceivers(); i < n; ++i)