mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 21:58:31 +09:00
[Fix] (MG_Backend/DirectGLES): Improve iteration safety in CollectGarbage.
This commit is contained in:
@@ -79,14 +79,26 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CollectGarbage() {
|
void CollectGarbage() {
|
||||||
for (auto trackedStateIt = m_stateRefs.begin(); trackedStateIt != m_stateRefs.end();) {
|
if (m_isCollecting) {
|
||||||
if (trackedStateIt->second.expired()) {
|
return;
|
||||||
m_backendObjects.erase(trackedStateIt->first);
|
}
|
||||||
trackedStateIt = m_stateRefs.erase(trackedStateIt);
|
|
||||||
} else {
|
m_isCollecting = true;
|
||||||
++trackedStateIt;
|
|
||||||
|
Vector<StateObject*> staleKeys;
|
||||||
|
staleKeys.reserve(m_stateRefs.size());
|
||||||
|
for (const auto& [stateKey, stateWeakRef] : m_stateRefs) {
|
||||||
|
if (stateWeakRef.expired()) {
|
||||||
|
staleKeys.push_back(stateKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (auto* stateKey : staleKeys) {
|
||||||
|
m_stateRefs.erase(stateKey);
|
||||||
|
m_backendObjects.erase(stateKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_isCollecting = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -94,6 +106,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
StateRefMap m_stateRefs;
|
StateRefMap m_stateRefs;
|
||||||
BackendMap m_backendObjects;
|
BackendMap m_backendObjects;
|
||||||
Uint32 m_gcTick = 0;
|
Uint32 m_gcTick = 0;
|
||||||
|
Bool m_isCollecting = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace BufferImpl {
|
namespace BufferImpl {
|
||||||
|
|||||||
Reference in New Issue
Block a user