ksys: Add several MessageDispatcher functions

This commit is contained in:
Léo Lam
2021-01-31 22:15:46 +01:00
parent eaa0f651ef
commit fb09e658e2
4 changed files with 97 additions and 16 deletions
@@ -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
@@ -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