summaryrefslogtreecommitdiff
path: root/src/KingSystem/Resource/resResourceMgrTask.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-10-11 21:42:10 +0200
committerLéo Lam <leo@leolam.fr>2020-10-11 21:42:10 +0200
commit0a0d287e37d6353616885205fdb8a0c525c37ce4 (patch)
treea4179f44d5696307d610d512718018f2e1ae1e2d /src/KingSystem/Resource/resResourceMgrTask.cpp
parent1c9d5781aea6ee66c726848be536cd0a86f8c66a (diff)
ksys/res: Implement ResourceMgrTask cache clear functions
Diffstat (limited to 'src/KingSystem/Resource/resResourceMgrTask.cpp')
-rw-r--r--src/KingSystem/Resource/resResourceMgrTask.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/KingSystem/Resource/resResourceMgrTask.cpp b/src/KingSystem/Resource/resResourceMgrTask.cpp
index b4850a03..d0a96b21 100644
--- a/src/KingSystem/Resource/resResourceMgrTask.cpp
+++ b/src/KingSystem/Resource/resResourceMgrTask.cpp
@@ -247,6 +247,80 @@ void ResourceMgrTask::deregisterUnit(ResourceUnit* unit) {
}
}
+void ResourceMgrTask::requestClearCache(ResourceUnit** p_unit, util::Task* task) {
+ if (!p_unit || !*p_unit || !(*p_unit)->isStatusFlag8000Set()) {
+ stubbedLogFunction();
+ return;
+ }
+
+ if ((*p_unit)->getRefCount() > 0 || (*p_unit)->isStatus1() || (*p_unit)->isStatusFlag10000Set())
+ return;
+
+ (*p_unit)->setStatusFlag10000();
+
+ {
+ ControlTaskRequest req;
+ req.mHasHandle = true;
+ req.mSynchronous = false;
+ req.mLaneId = u8(LaneId::_4);
+ req.mThread = mResourceControlThread;
+ req.mDelegate = &mUnitClearCacheForSyncFn.fn;
+ req.mPostRunCallback = &mUnitClearCacheForSyncFn.cb;
+ req.mUserData = *p_unit;
+ req.mName = "ClearCache";
+ if (task)
+ task->submitRequest(req);
+ else
+ (*p_unit)->mTask3.submitRequest(req);
+ }
+ *p_unit = nullptr;
+}
+
+void ResourceMgrTask::requestClearCacheForSync(ResourceUnit** p_unit, bool clear_immediately,
+ bool delete_immediately) {
+ if (!p_unit || !*p_unit || !(*p_unit)->isStatusFlag8000Set()) {
+ goto fail;
+ }
+
+ if ((*p_unit)->isStatus1() || !(*p_unit)->mCache || (*p_unit)->getRefCount() > 0)
+ return;
+
+ if ((*p_unit)->isStatusFlag10000Set()) {
+ fail:
+ stubbedLogFunction();
+ return;
+ }
+
+ (*p_unit)->setStatusFlag10000();
+
+ if (clear_immediately) {
+ (*p_unit)->removeTask3FromQueue();
+ (*p_unit)->clearCacheForSync(true);
+ (*p_unit)->clearCache(nullptr);
+ static_cast<void>((*p_unit)->getStatus());
+ ResourceUnit* ptr = *p_unit;
+ if (delete_immediately)
+ deleteUnit(ptr, true);
+ else
+ requestDeleteUnit(&ptr);
+
+ } else {
+ ControlTaskRequest req;
+ req.mHasHandle = true;
+ req.mSynchronous = true;
+ req.mLaneId = u8(LaneId::_4);
+ req.mThread = mResourceControlThread;
+ req.mDelegate = &mUnitClearCacheForSyncFn.fn;
+ req.mUserData = *p_unit;
+ req.mName = "ClearCache(ForSync)";
+ (*p_unit)->mTask3.submitRequest(req);
+ }
+ *p_unit = nullptr;
+}
+
+#ifdef MATCHING_HACK_NX_CLANG
+[[gnu::noinline]]
+#endif
void ResourceMgrTask::deleteUnit(ResourceUnit*& unit, bool sync) {
if (!unit)
return;