diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 64286f56..dafc9e24 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -84603,13 +84603,13 @@ 0x0000007100fdfef4,TempResourceLoader::getResError,8, 0x0000007100fdfefc,TempResourceLoader::getFileDeviceIfHasResource,56, 0x0000007100fdff34,TempResourceLoader::getHeapSize,16, -0x0000007100fdff44,Struct10::ctor,8, -0x0000007100fdff4c,sub_7100FDFF4C,88, -0x0000007100fdffa4,Struct10::initEventAndOverlayArenaS1,260, -0x0000007100fe00a8,Struct10::getHeapSize,36, -0x0000007100fe00cc,Struct10::getS1,8, -0x0000007100fe00d4,Struct10::waitForEvent,104, -0x0000007100fe013c,Struct10::eventSetSignal,8, +0x0000007100fdff44,Struct10::ctor,8,_ZN4ksys3res11ArchiveWorkC1Ev +0x0000007100fdff4c,sub_7100FDFF4C,88,_ZN4ksys3res11ArchiveWorkD1Ev +0x0000007100fdffa4,Struct10::initEventAndOverlayArenaS1,260,_ZN4ksys3res11ArchiveWork4initERKNS1_7InitArgE +0x0000007100fe00a8,Struct10::getHeapSize,36,_ZNK4ksys3res11ArchiveWork11getHeapSizeEv +0x0000007100fe00cc,Struct10::getS1,8,_ZNK4ksys3res11ArchiveWork8getArenaEv +0x0000007100fe00d4,Struct10::waitForEvent,104,_ZN4ksys3res11ArchiveWork12waitForEventEj +0x0000007100fe013c,Struct10::eventSetSignal,8,_ZN4ksys3res11ArchiveWork8setEventEv 0x0000007100fe0144,sub_7100FE0144,328, 0x0000007100fe028c,sub_7100FE028C,80, 0x0000007100fe02dc,sub_7100FE02DC,20, diff --git a/src/KingSystem/Resource/CMakeLists.txt b/src/KingSystem/Resource/CMakeLists.txt index f0bd0869..715888cf 100644 --- a/src/KingSystem/Resource/CMakeLists.txt +++ b/src/KingSystem/Resource/CMakeLists.txt @@ -82,6 +82,8 @@ target_sources(uking PRIVATE GeneralParamList/resGParamListObjectZora.h GeneralParamList/resGParamListTraits.h + resArchiveWork.cpp + resArchiveWork.h resCache.cpp resCache.h resCacheCriticalSection.cpp diff --git a/src/KingSystem/Resource/resArchiveWork.cpp b/src/KingSystem/Resource/resArchiveWork.cpp new file mode 100644 index 00000000..617bacfe --- /dev/null +++ b/src/KingSystem/Resource/resArchiveWork.cpp @@ -0,0 +1,60 @@ +#include "KingSystem/Resource/resArchiveWork.h" +#include "KingSystem/System/OverlayArena.h" +#include "KingSystem/Utils/SafeDelete.h" +#include "KingSystem/Utils/Thread/Event.h" + +namespace ksys::res { + +ArchiveWork::ArchiveWork() = default; + +ArchiveWork::~ArchiveWork() { + if (mArena) { + mArena->clearUnits(); + util::safeDelete(mArena); + } + util::safeDelete(mEvent); +} + +bool ArchiveWork::init(const ArchiveWork::InitArg& arg) { + mEvent = new (arg.heap) util::Event( + nullptr, sead::IDisposer::HeapNullOption::DoNotAppendDisposerIfNoHeapSpecified, false); + mEvent->resetSignal(); + + mArena = new (arg.heap) OverlayArena; + + OverlayArena::InitArg arena_arg; + arena_arg.set_flag_1 = true; + arena_arg.size = arg.arena_size; + arena_arg.use_best_fit_alloc_mode = false; + arena_arg.set_flag_10 = false; + arena_arg.set_flag_8 = arg.arena_set_flag_8; + arena_arg.name = arg.name; + arena_arg.heap = arg.arena_heap; + arena_arg.heap2 = arg.arena_heap2; + return mArena->init(arena_arg); +} + +u32 ArchiveWork::getHeapSize() const { + return mArena->getHeap()->getSize(); +} + +OverlayArena* ArchiveWork::getArena() const { + return mArena; +} + +bool ArchiveWork::waitForEvent(u32 milliseconds) { + if (milliseconds != 0) { + const auto duration = sead::TickSpan::fromMilliSeconds(milliseconds); + if (!mEvent->wait(duration)) + return false; + } else { + mEvent->wait(); + } + return true; +} + +void ArchiveWork::setEvent() { + mEvent->setSignal(); +} + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resArchiveWork.h b/src/KingSystem/Resource/resArchiveWork.h new file mode 100644 index 00000000..2ec0f3e2 --- /dev/null +++ b/src/KingSystem/Resource/resArchiveWork.h @@ -0,0 +1,51 @@ +#pragma once + +#include +#include +#include "KingSystem/Utils/Types.h" + +namespace sead { +class Heap; +} + +namespace ksys { + +class OverlayArena; + +namespace util { +class Event; +} + +namespace res { + +class ArchiveWork { +public: + struct InitArg { + bool arena_set_flag_8; + u32 arena_size; + sead::Heap* heap; + sead::Heap* arena_heap; + sead::Heap* arena_heap2; + sead::SafeString name; + }; + KSYS_CHECK_SIZE_NX150(InitArg, 0x30); + + ArchiveWork(); + ~ArchiveWork(); + + bool init(const InitArg& arg); + u32 getHeapSize() const; + OverlayArena* getArena() const; + + bool waitForEvent(u32 milliseconds = 0); + void setEvent(); + +private: + util::Event* mEvent = nullptr; + OverlayArena* mArena = nullptr; +}; +KSYS_CHECK_SIZE_NX150(ArchiveWork, 0x10); + +} // namespace res + +} // namespace ksys