From fb09e658e2ab42fb0177f89c831cb2b78692bf07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Sun, 31 Jan 2021 22:15:46 +0100 Subject: ksys: Add several MessageDispatcher functions --- src/KingSystem/Utils/Thread/MessageDispatcher.cpp | 46 ++++++++++++++++++++++- src/KingSystem/Utils/Thread/MessageDispatcher.h | 39 +++++++++++++++++++ 2 files changed, 83 insertions(+), 2 deletions(-) (limited to 'src/KingSystem') 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 +#include +#include +#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 +#include #include #include +#include #include +#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 mFlags; + sead::Buffer mBoolBuffer; + sead::ObjList mBools; + sead::CriticalSection mCritSection; + util::Event mUpdateEndEvent; + int mNumEntries = 0; }; } // namespace ksys -- cgit v1.2.3