Fix LoadAssetTask to properly dereference asset loading task pointer when asset init fails
This commit is contained in:
@@ -26,18 +26,7 @@ public:
|
|||||||
|
|
||||||
~LoadAssetTask()
|
~LoadAssetTask()
|
||||||
{
|
{
|
||||||
auto asset = Asset.Get();
|
DereferenceAsset();
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -69,15 +58,7 @@ protected:
|
|||||||
|
|
||||||
void OnFail() override
|
void OnFail() override
|
||||||
{
|
{
|
||||||
auto asset = Asset.Get();
|
DereferenceAsset(true);
|
||||||
if (asset)
|
|
||||||
{
|
|
||||||
Asset = nullptr;
|
|
||||||
asset->Locker.Lock();
|
|
||||||
if (Platform::AtomicRead(&asset->_loadingTask) == (intptr)this)
|
|
||||||
Platform::AtomicStore(&asset->_loadingTask, 0);
|
|
||||||
asset->Locker.Unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Base
|
// Base
|
||||||
ContentLoadTask::OnFail();
|
ContentLoadTask::OnFail();
|
||||||
@@ -85,18 +66,38 @@ protected:
|
|||||||
|
|
||||||
void OnEnd() override
|
void OnEnd() override
|
||||||
{
|
{
|
||||||
auto asset = Asset.Get();
|
DereferenceAsset();
|
||||||
if (asset)
|
|
||||||
{
|
|
||||||
Asset = nullptr;
|
|
||||||
asset->Locker.Lock();
|
|
||||||
if (Platform::AtomicRead(&asset->_loadingTask) == (intptr)this)
|
|
||||||
Platform::AtomicStore(&asset->_loadingTask, 0);
|
|
||||||
asset->Locker.Unlock();
|
|
||||||
asset = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Base
|
// Base
|
||||||
ContentLoadTask::OnEnd();
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user