ksys/res: Add ArchiveWork

Required for TempResourceLoader, which is used by ActorParamMgr among
other things
This commit is contained in:
Léo Lam 2020-11-12 00:11:21 +01:00
parent 2abce16984
commit 2f80f2b581
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
4 changed files with 120 additions and 7 deletions

View File

@ -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,

Can't render this file because it is too large.

View File

@ -82,6 +82,8 @@ target_sources(uking PRIVATE
GeneralParamList/resGParamListObjectZora.h
GeneralParamList/resGParamListTraits.h
resArchiveWork.cpp
resArchiveWork.h
resCache.cpp
resCache.h
resCacheCriticalSection.cpp

View File

@ -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

View File

@ -0,0 +1,51 @@
#pragma once
#include <basis/seadTypes.h>
#include <prim/seadSafeString.h>
#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