mirror of
https://github.com/zeldaret/botw
synced 2026-06-05 19:27:26 -04:00
ksys: Add several MessageDispatcher functions
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user