summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-09-27 00:12:24 +0200
committerLéo Lam <leo@leolam.fr>2020-09-27 13:00:37 +0200
commitba5a3c642d834a04800c6c6bc84cab7fe04ea0e2 (patch)
treeed777a2af2b074182ee30e3cd4080c80f6958502 /src
parentb1926813b720b1f8088db62160cb60430b0b11f2 (diff)
ksys/res: Add ControlTask, TaskRequest
Diffstat (limited to 'src')
-rw-r--r--src/KingSystem/Resource/CMakeLists.txt6
-rw-r--r--src/KingSystem/Resource/resControlTask.cpp30
-rw-r--r--src/KingSystem/Resource/resControlTask.h41
-rw-r--r--src/KingSystem/Resource/resResourceMgrTask.cpp20
-rw-r--r--src/KingSystem/Resource/resResourceMgrTask.h10
-rw-r--r--src/KingSystem/Resource/resTaskRequest.cpp1
-rw-r--r--src/KingSystem/Resource/resTaskRequest.h25
-rw-r--r--src/KingSystem/Utils/CMakeLists.txt1
-rw-r--r--src/KingSystem/Utils/Thread/Task.h2
-rw-r--r--src/KingSystem/Utils/Thread/TaskData.h11
10 files changed, 147 insertions, 0 deletions
diff --git a/src/KingSystem/Resource/CMakeLists.txt b/src/KingSystem/Resource/CMakeLists.txt
index 46218270..87918287 100644
--- a/src/KingSystem/Resource/CMakeLists.txt
+++ b/src/KingSystem/Resource/CMakeLists.txt
@@ -94,9 +94,15 @@ target_sources(uking PRIVATE
resHandle.h
resLoadRequest.cpp
resLoadRequest.h
+ resControlTask.cpp
+ resControlTask.h
resOffsetReadFileDevice.cpp
resOffsetReadFileDevice.h
+ resResourceMgrTask.cpp
+ resResourceMgrTask.h
resSystem.h
+ resTaskRequest.cpp
+ resTaskRequest.h
resUnit.cpp
resUnit.h
diff --git a/src/KingSystem/Resource/resControlTask.cpp b/src/KingSystem/Resource/resControlTask.cpp
new file mode 100644
index 00000000..bdade971
--- /dev/null
+++ b/src/KingSystem/Resource/resControlTask.cpp
@@ -0,0 +1,30 @@
+#include "KingSystem/Resource/resControlTask.h"
+#include "KingSystem/Resource/resSystem.h"
+#include "KingSystem/Resource/resTaskRequest.h"
+
+namespace ksys::res {
+
+ControlTask::ControlTask(sead::Heap* heap) : util::ManagedTask(heap) {}
+
+void ControlTask::onRun_() {}
+
+void ControlTask::prepareImpl_(util::TaskRequest* req_) {
+ auto* req = static_cast<TaskRequest*>(req_);
+
+ mData.mHasResLoadReq = req->mHasResLoadReq;
+ mData.mPackResUnit = req->mPackResUnit;
+ mData.mResHandle = req->mResHandle;
+ mData.mResPath = req->mResPath;
+ mData.mResLoadReq = req->mResLoadReq;
+ mData.mResLoadReq.mPath = mData.mResPath;
+
+ if (getUserData() == nullptr)
+ setUserData(&mData);
+}
+
+void ControlTask::preRemoveImpl_() {
+ if (returnFalse())
+ stubbedLogFunction();
+}
+
+} // namespace ksys::res
diff --git a/src/KingSystem/Resource/resControlTask.h b/src/KingSystem/Resource/resControlTask.h
new file mode 100644
index 00000000..8bebc1fd
--- /dev/null
+++ b/src/KingSystem/Resource/resControlTask.h
@@ -0,0 +1,41 @@
+#pragma once
+
+#include <prim/seadSafeString.h>
+#include "KingSystem/Resource/resLoadRequest.h"
+#include "KingSystem/Utils/Thread/ManagedTask.h"
+#include "KingSystem/Utils/Thread/TaskData.h"
+#include "KingSystem/Utils/Types.h"
+
+namespace ksys::res {
+
+class Handle;
+class ResourceUnit;
+
+class ControlTaskData : public util::TaskData {
+ SEAD_RTTI_OVERRIDE(ControlTaskData, util::TaskData)
+public:
+ virtual ~ControlTaskData() = default;
+
+ bool mHasResLoadReq = false;
+ ResourceUnit* mPackResUnit = nullptr;
+ Handle* mResHandle = nullptr;
+ sead::FixedSafeString<128> mResPath;
+ LoadRequest mResLoadReq;
+};
+KSYS_CHECK_SIZE_NX150(ControlTaskData, 0x138);
+
+class ControlTask : public util::ManagedTask {
+ SEAD_RTTI_OVERRIDE(ControlTask, util::ManagedTask)
+public:
+ explicit ControlTask(sead::Heap* heap);
+
+private:
+ void onRun_() override;
+ void prepareImpl_(util::TaskRequest* req) override;
+ void preRemoveImpl_() override;
+
+ ControlTaskData mData;
+};
+KSYS_CHECK_SIZE_NX150(ControlTask, 0x1f8);
+
+} // namespace ksys::res
diff --git a/src/KingSystem/Resource/resResourceMgrTask.cpp b/src/KingSystem/Resource/resResourceMgrTask.cpp
index c5b53de1..019a46de 100644
--- a/src/KingSystem/Resource/resResourceMgrTask.cpp
+++ b/src/KingSystem/Resource/resResourceMgrTask.cpp
@@ -1 +1,21 @@
#include "KingSystem/Resource/resResourceMgrTask.h"
+#include <thread/seadThreadUtil.h>
+#include "KingSystem/Utils/Thread/GameTaskThread.h"
+#include "KingSystem/Utils/Thread/TaskThread.h"
+
+namespace ksys::res {
+
+util::TaskThread* ResourceMgrTask::makeResourceLoadingThread(sead::Heap* heap,
+ bool use_game_task_thread) {
+ if (use_game_task_thread) {
+ return new (heap) util::GameTaskThread(
+ "Resource Loading", heap, sead::ThreadUtil::ConvertPrioritySeadToPlatform(19),
+ sead::MessageQueue::BlockType::Blocking, 0x7fffffff, 0xfa000, 32);
+ }
+
+ return new (heap) util::TaskThread(
+ "Resource Loading", heap, sead::ThreadUtil::ConvertPrioritySeadToPlatform(19),
+ sead::MessageQueue::BlockType::Blocking, 0x7fffffff, 0xa000, 32);
+}
+
+} // namespace ksys::res
diff --git a/src/KingSystem/Resource/resResourceMgrTask.h b/src/KingSystem/Resource/resResourceMgrTask.h
index e9bdd2db..18ea07f0 100644
--- a/src/KingSystem/Resource/resResourceMgrTask.h
+++ b/src/KingSystem/Resource/resResourceMgrTask.h
@@ -1,8 +1,16 @@
#pragma once
+namespace sead {
+class Heap;
+}
+
namespace ksys {
class OverlayArena;
+
+namespace util {
+class TaskThread;
}
+} // namespace ksys
namespace ksys::res {
@@ -14,6 +22,8 @@ public:
void insertOverlayArena(OverlayArena* arena);
OverlayArena* getSomeArena() const;
+ util::TaskThread* makeResourceLoadingThread(sead::Heap* heap, bool use_game_task_thread);
+
private:
static ResourceMgrTask* sInstance;
};
diff --git a/src/KingSystem/Resource/resTaskRequest.cpp b/src/KingSystem/Resource/resTaskRequest.cpp
new file mode 100644
index 00000000..85d649d1
--- /dev/null
+++ b/src/KingSystem/Resource/resTaskRequest.cpp
@@ -0,0 +1 @@
+#include "resTaskRequest.h"
diff --git a/src/KingSystem/Resource/resTaskRequest.h b/src/KingSystem/Resource/resTaskRequest.h
new file mode 100644
index 00000000..f9925417
--- /dev/null
+++ b/src/KingSystem/Resource/resTaskRequest.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "KingSystem/Resource/resLoadRequest.h"
+#include "KingSystem/Utils/Thread/Task.h"
+#include "KingSystem/Utils/Types.h"
+
+namespace ksys::res {
+
+class Handle;
+class ResourceUnit;
+
+class TaskRequest : public util::TaskRequest {
+ SEAD_RTTI_OVERRIDE(TaskRequest, util::TaskRequest)
+public:
+ TaskRequest() = default;
+
+ bool mHasResLoadReq = false;
+ ResourceUnit* mPackResUnit = nullptr;
+ Handle* mResHandle = nullptr;
+ sead::FixedSafeString<128> mResPath;
+ LoadRequest mResLoadReq;
+};
+KSYS_CHECK_SIZE_NX150(TaskRequest, 0x180);
+
+} // namespace ksys::res
diff --git a/src/KingSystem/Utils/CMakeLists.txt b/src/KingSystem/Utils/CMakeLists.txt
index 544422c5..34aa8ef6 100644
--- a/src/KingSystem/Utils/CMakeLists.txt
+++ b/src/KingSystem/Utils/CMakeLists.txt
@@ -9,6 +9,7 @@ target_sources(uking PRIVATE
Thread/ManagedTaskHandle.h
Thread/Task.cpp
Thread/Task.h
+ Thread/TaskData.h
Thread/TaskMgr.cpp
Thread/TaskMgr.h
Thread/TaskQueueBase.cpp
diff --git a/src/KingSystem/Utils/Thread/Task.h b/src/KingSystem/Utils/Thread/Task.h
index 4b86abe6..fa5a020c 100644
--- a/src/KingSystem/Utils/Thread/Task.h
+++ b/src/KingSystem/Utils/Thread/Task.h
@@ -73,6 +73,8 @@ KSYS_CHECK_SIZE_NX150(TaskDelegateSetter, 0x10);
class TaskRequest {
SEAD_RTTI_BASE(TaskRequest)
public:
+ // TODO: initialize the members
+ TaskRequest() = default;
virtual ~TaskRequest() = default;
bool mHasHandle;
diff --git a/src/KingSystem/Utils/Thread/TaskData.h b/src/KingSystem/Utils/Thread/TaskData.h
new file mode 100644
index 00000000..68db7ce0
--- /dev/null
+++ b/src/KingSystem/Utils/Thread/TaskData.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#include <prim/seadRuntimeTypeInfo.h>
+
+namespace ksys::util {
+
+class TaskData {
+ SEAD_RTTI_BASE(TaskData)
+};
+
+} // namespace ksys::util