mirror of https://github.com/zeldaret/botw.git
ksys: Add several MessageDispatcher functions
This commit is contained in:
parent
eaa0f651ef
commit
fb09e658e2
|
@ -92631,16 +92631,16 @@
|
|||
0x00000071011f4a58,sub_71011F4A58,72,_ZN4ksys17MessageDispatcher9MainQueue10addMessageERKNS_7MessageE
|
||||
0x00000071011f4aa0,sub_71011F4AA0,112,_ZN4ksys17MessageDispatcher9MainQueue12processQueueERNS_16MessageProcessorE
|
||||
0x00000071011f4b10,nullsub_4669,4,_ZN4ksys17MessageDispatcher6Queues11DummyLogger3logERKNS_7MessageEb
|
||||
0x00000071011f4b14,nullsub_4670,4,
|
||||
0x00000071011f4b18,j__ZdlPv_1220,4,
|
||||
0x00000071011f4b1c,nullsub_4671,4,
|
||||
0x00000071011f4b20,sub_71011F4B20,100,
|
||||
0x00000071011f4b84,sub_71011F4B84,108,
|
||||
0x00000071011f4bf0,GlobalMessage::createInstance,224,
|
||||
0x00000071011f4cd0,GlobalMessage::dtor,228,
|
||||
0x00000071011f4db4,GlobalMessage::dtorDelete,36,
|
||||
0x00000071011f4dd8,GlobalMessage::init,580,
|
||||
0x00000071011f501c,GlobalMessage::currentTlsSlotIsSame,56,
|
||||
0x00000071011f4b14,nullsub_4670,4,_ZN4ksys17MessageDispatcher6LoggerD1Ev
|
||||
0x00000071011f4b18,j__ZdlPv_1220,4,_ZN4ksys17MessageDispatcher6LoggerD0Ev
|
||||
0x00000071011f4b1c,nullsub_4671,4,_ZN4ksys17MessageDispatcher6Logger3logERKNS_7MessageEb
|
||||
0x00000071011f4b20,sub_71011F4B20,100,_ZN4ksys17MessageDispatcher18SingletonDisposer_D2Ev
|
||||
0x00000071011f4b84,sub_71011F4B84,108,_ZN4ksys17MessageDispatcher18SingletonDisposer_D0Ev
|
||||
0x00000071011f4bf0,GlobalMessage::createInstance,224,_ZN4ksys17MessageDispatcher14createInstanceEPN4sead4HeapE
|
||||
0x00000071011f4cd0,GlobalMessage::dtor,228,_ZN4ksys17MessageDispatcherD1Ev
|
||||
0x00000071011f4db4,GlobalMessage::dtorDelete,36,_ZN4ksys17MessageDispatcherD0Ev
|
||||
0x00000071011f4dd8,GlobalMessage::init,580,_ZN4ksys17MessageDispatcher4initERKNS0_7InitArgEPN4sead4HeapE
|
||||
0x00000071011f501c,GlobalMessage::currentTlsSlotIsSame,56,_ZNK4ksys17MessageDispatcher27isProcessingOnCurrentThreadEv
|
||||
0x00000071011f5054,GlobalMessage::x,376,
|
||||
0x00000071011f51cc,GlobalMessage::x_0,344,
|
||||
0x00000071011f5324,GlobalMessage::x_1,124,
|
||||
|
@ -92648,10 +92648,10 @@
|
|||
0x00000071011f548c,GlobalMessage::x_2,208,
|
||||
0x00000071011f555c,GlobalMessage::x_3,268,
|
||||
0x00000071011f5668,GlobalMessage::x_4,248,
|
||||
0x00000071011f5760,GlobalMessage::rtti1,204,
|
||||
0x00000071011f582c,GlobalMessage::rtti2,92,
|
||||
0x00000071011f5760,GlobalMessage::rtti1,204,_ZNK4ksys17MessageDispatcher27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
|
||||
0x00000071011f582c,GlobalMessage::rtti2,92,_ZNK4ksys17MessageDispatcher18getRuntimeTypeInfoEv
|
||||
0x00000071011f5888,j__ZdlPv_1221,4,_ZN4ksys17MessageDispatcher6Queues11DummyLoggerD0Ev
|
||||
0x00000071011f588c,sub_71011F588C,140,
|
||||
0x00000071011f588c,sub_71011F588C,140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys21MessageDispatcherBaseEE9isDerivedEPKNS0_9InterfaceE
|
||||
0x00000071011f5918,sub_71011F5918,240,_ZN4ksys17MessageDispatcher5QueueD1Ev
|
||||
0x00000071011f5a08,sub_71011F5A08,240,_ZN4ksys17MessageDispatcher5QueueD0Ev
|
||||
0x00000071011f5af8,sub_71011F5AF8,460,_ZN4ksys17MessageDispatcher5Queue10addMessageERKNS_7MessageE
|
||||
|
|
Can't render this file because it is too large.
|
2
lib/sead
2
lib/sead
|
@ -1 +1 @@
|
|||
Subproject commit 9ce3831edcb432942600283f33ebc93c0b810d29
|
||||
Subproject commit 1737b022c7b70c04cc2471ff58d00ead1b6b6a93
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue