diff options
| author | Léo Lam <leo@leolam.fr> | 2021-01-31 22:15:46 +0100 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2021-02-01 01:41:21 +0100 |
| commit | fb09e658e2ab42fb0177f89c831cb2b78692bf07 (patch) | |
| tree | b84febbc61f81301224882da85e92c9a759b0ae5 /src | |
| parent | eaa0f651efa89bd6bff75fcbb482fc57a5b7d77a (diff) | |
ksys: Add several MessageDispatcher functions
Diffstat (limited to 'src')
| -rw-r--r-- | src/KingSystem/Utils/Thread/MessageDispatcher.cpp | 46 | ||||
| -rw-r--r-- | src/KingSystem/Utils/Thread/MessageDispatcher.h | 39 |
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 |
