summaryrefslogtreecommitdiff
path: root/src/KingSystem/Utils/Thread
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2021-02-05 18:10:37 +0100
committerLéo Lam <leo@leolam.fr>2021-02-05 22:03:02 +0100
commitd5b981a233dd625815798e7f0db91fd14c2a30d8 (patch)
tree2270914a0b09780b81665b97c342a5e1e3038013 /src/KingSystem/Utils/Thread
parentc2426371f710995aced40f41694355bdc8656861 (diff)
ksys: Add ActorMessageTransceiver
Diffstat (limited to 'src/KingSystem/Utils/Thread')
-rw-r--r--src/KingSystem/Utils/Thread/ActorMessageTransceiver.cpp62
-rw-r--r--src/KingSystem/Utils/Thread/ActorMessageTransceiver.h52
-rw-r--r--src/KingSystem/Utils/Thread/MessageTransceiverCommon.h18
3 files changed, 124 insertions, 8 deletions
diff --git a/src/KingSystem/Utils/Thread/ActorMessageTransceiver.cpp b/src/KingSystem/Utils/Thread/ActorMessageTransceiver.cpp
new file mode 100644
index 00000000..5646de14
--- /dev/null
+++ b/src/KingSystem/Utils/Thread/ActorMessageTransceiver.cpp
@@ -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
diff --git a/src/KingSystem/Utils/Thread/ActorMessageTransceiver.h b/src/KingSystem/Utils/Thread/ActorMessageTransceiver.h
new file mode 100644
index 00000000..6a7f24f2
--- /dev/null
+++ b/src/KingSystem/Utils/Thread/ActorMessageTransceiver.h
@@ -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
diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverCommon.h b/src/KingSystem/Utils/Thread/MessageTransceiverCommon.h
index 0e69d68c..4f4f0fc9 100644
--- a/src/KingSystem/Utils/Thread/MessageTransceiverCommon.h
+++ b/src/KingSystem/Utils/Thread/MessageTransceiverCommon.h
@@ -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)