summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2021-01-31 22:15:46 +0100
committerLéo Lam <leo@leolam.fr>2021-02-01 01:41:21 +0100
commitfb09e658e2ab42fb0177f89c831cb2b78692bf07 (patch)
treeb84febbc61f81301224882da85e92c9a759b0ae5 /src
parenteaa0f651efa89bd6bff75fcbb482fc57a5b7d77a (diff)
ksys: Add several MessageDispatcher functions
Diffstat (limited to 'src')
-rw-r--r--src/KingSystem/Utils/Thread/MessageDispatcher.cpp46
-rw-r--r--src/KingSystem/Utils/Thread/MessageDispatcher.h39
2 files changed, 83 insertions, 2 deletions
diff --git a/src/KingSystem/Utils/Thread/MessageDispatcher.cpp b/src/KingSystem/Utils/Thread/MessageDispatcher.cpp
index a43a1596..cbd4f905 100644
--- a/src/KingSystem/Utils/Thread/MessageDispatcher.cpp
+++ b/src/KingSystem/Utils/Thread/MessageDispatcher.cpp
@@ -1,10 +1,13 @@
#include "KingSystem/Utils/Thread/MessageDispatcher.h"
+#include <heap/seadHeapMgr.h>
+#include <prim/seadMemUtil.h>
+#include <thread/seadThread.h>
+#include "KingSystem/Utils/HeapUtil.h"
+#include "KingSystem/Utils/SafeDelete.h"
#include "KingSystem/Utils/Thread/Message.h"
namespace ksys {
-SEAD_SINGLETON_DISPOSER_IMPL(MessageDispatcher)
-
MessageDispatcher::Queue::Queue() = default;
MessageDispatcher::Queue::~Queue() {
@@ -69,6 +72,10 @@ void MessageDispatcher::DoubleBufferedQueue::processQueue(MessageProcessor& proc
MessageDispatcher::Queues::DummyLogger::~DummyLogger() = default;
+MessageDispatcher::Logger::~Logger() = default;
+
+void MessageDispatcher::Logger::log(const Message& message, bool success) {}
+
MessageDispatcher::MainQueue::MainQueue() = default;
MessageDispatcher::MainQueue::~MainQueue() = default;
@@ -111,4 +118,39 @@ MessageDispatcher::Queues::~Queues() {
mMainQueue.clear();
}
+SEAD_SINGLETON_DISPOSER_IMPL(MessageDispatcher)
+
+MessageDispatcher::~MessageDispatcher() {
+ mBools.freeBuffer();
+ mBoolBuffer.freeBuffer();
+ util::safeDelete(mQueues);
+}
+
+void MessageDispatcher::init(const InitArg& arg, sead::Heap* heap) {
+ heap = util::getHeapOrCurrentHeap(heap);
+ sead::ScopedCurrentHeapSetter heap_setter{heap};
+
+ if (arg.set_instance)
+ setAsGlobalInstance();
+
+ mQueues = new (heap) Queues(&mLogger);
+
+ mUpdateEndEvent.initialize(true);
+ mUpdateEndEvent.setSignal();
+
+ mBoolBuffer.allocBufferAssert(arg.num_bools, heap);
+ sead::MemUtil::fillZero(mBoolBuffer.getBufferPtr(), mBoolBuffer.getByteSize());
+
+ mBools.allocBuffer(arg.num_bools, heap);
+ for (int i = 0, n = mBoolBuffer.size(); i < n; ++i) {
+ mBools.emplaceBack(&mBoolBuffer[i]);
+ }
+
+ mFlags.set(Flag::Initialized);
+}
+
+bool MessageDispatcher::isProcessingOnCurrentThread() const {
+ return mProcessingThread == sead::ThreadMgr::instance()->getCurrentThread();
+}
+
} // namespace ksys
diff --git a/src/KingSystem/Utils/Thread/MessageDispatcher.h b/src/KingSystem/Utils/Thread/MessageDispatcher.h
index 5ad36708..20b81f43 100644
--- a/src/KingSystem/Utils/Thread/MessageDispatcher.h
+++ b/src/KingSystem/Utils/Thread/MessageDispatcher.h
@@ -1,12 +1,20 @@
#pragma once
+#include <container/seadBuffer.h>
+#include <container/seadObjList.h>
#include <heap/seadDisposer.h>
#include <prim/seadRuntimeTypeInfo.h>
+#include <prim/seadTypedBitFlag.h>
#include <thread/seadCriticalSection.h>
+#include "KingSystem/Utils/Thread/Event.h"
#include "KingSystem/Utils/Thread/MessageDispatcherBase.h"
#include "KingSystem/Utils/Thread/MessageProcessor.h"
#include "KingSystem/Utils/UniqueArrayPtr.h"
+namespace sead {
+class Thread;
+}
+
namespace ksys {
class Message;
@@ -19,6 +27,18 @@ class MessageDispatcher : public MessageDispatcherBase {
~MessageDispatcher() override;
public:
+ struct InitArg {
+ // TODO: rename
+ int num1;
+ int num2;
+ int num_bools;
+ bool set_instance;
+ };
+
+ void init(const InitArg& arg, sead::Heap* heap);
+
+ bool isProcessingOnCurrentThread() const;
+
void registerTransceiver(MessageReceiverEx& receiver) override;
void deregisterTransceiver(MessageReceiverEx& receiver) override;
bool sendMessage(const MesTransceiverId& src, const MesTransceiverId& dest,
@@ -97,6 +117,25 @@ private:
MessageProcessor mProcessor;
bool mIsProcessing = false;
};
+
+ enum class Flag {
+ Initialized = 1 << 0,
+ };
+
+ struct Logger : MessageProcessor::Logger {
+ ~Logger() override;
+ void log(const Message& message, bool success) override;
+ };
+
+ sead::Thread* mProcessingThread{};
+ Logger mLogger{};
+ Queues* mQueues{};
+ sead::TypedBitFlag<Flag> mFlags;
+ sead::Buffer<bool> mBoolBuffer;
+ sead::ObjList<bool*> mBools;
+ sead::CriticalSection mCritSection;
+ util::Event mUpdateEndEvent;
+ int mNumEntries = 0;
};
} // namespace ksys