diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 6fe3f552..3a2fce5e 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -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 diff --git a/lib/sead b/lib/sead index 9ce3831e..1737b022 160000 --- a/lib/sead +++ b/lib/sead @@ -1 +1 @@ -Subproject commit 9ce3831edcb432942600283f33ebc93c0b810d29 +Subproject commit 1737b022c7b70c04cc2471ff58d00ead1b6b6a93 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