diff --git a/Source/Engine/Content/Loading/Tasks/LoadAssetTask.h b/Source/Engine/Content/Loading/Tasks/LoadAssetTask.h index 24bd66119..3f211b3c7 100644 --- a/Source/Engine/Content/Loading/Tasks/LoadAssetTask.h +++ b/Source/Engine/Content/Loading/Tasks/LoadAssetTask.h @@ -26,18 +26,7 @@ public: ~LoadAssetTask() { - auto asset = Asset.Get(); - if (asset) - { - asset->Locker.Lock(); - if (Platform::AtomicRead(&asset->_loadingTask) == (intptr)this) - { - Platform::AtomicStore(&asset->_loadState, (int64)Asset::LoadState::LoadFailed); - Platform::AtomicStore(&asset->_loadingTask, 0); - LOG(Error, "Loading asset \'{0}\' result: {1}.", ToString(), ToString(Result::TaskFailed)); - } - asset->Locker.Unlock(); - } + DereferenceAsset(); } public: @@ -69,15 +58,7 @@ protected: void OnFail() override { - auto asset = Asset.Get(); - if (asset) - { - Asset = nullptr; - asset->Locker.Lock(); - if (Platform::AtomicRead(&asset->_loadingTask) == (intptr)this) - Platform::AtomicStore(&asset->_loadingTask, 0); - asset->Locker.Unlock(); - } + DereferenceAsset(true); // Base ContentLoadTask::OnFail(); @@ -85,18 +66,38 @@ protected: void OnEnd() override { - auto asset = Asset.Get(); - if (asset) - { - Asset = nullptr; - asset->Locker.Lock(); - if (Platform::AtomicRead(&asset->_loadingTask) == (intptr)this) - Platform::AtomicStore(&asset->_loadingTask, 0); - asset->Locker.Unlock(); - asset = nullptr; - } + DereferenceAsset(); // Base ContentLoadTask::OnEnd(); } + +private: + void DereferenceAsset(bool failed = false) + { + auto asset = Asset.Get(); + if (asset) + { + asset->Locker.Lock(); + Task* task = (Task*)Platform::AtomicRead(&asset->_loadingTask); + if (task) + { + do + { + if (task == this) + { + Platform::AtomicStore(&asset->_loadingTask, 0); + if (failed) + { + Platform::AtomicStore(&asset->_loadState, (int64)Asset::LoadState::LoadFailed); + LOG(Error, "Loading asset \'{0}\' result: {1}.", ToString(), ToString(Result::TaskFailed)); + } + break; + } + task = task->GetContinueWithTask(); + } while (task); + } + asset->Locker.Unlock(); + } + } };