diff --git a/src/anbox/graphics/emugl/Renderer.cpp b/src/anbox/graphics/emugl/Renderer.cpp index 57929aa1e8cc21e8d3803c89644ca03b3b692bf6..1e51f39dc833107beac57f5bd3cd6556948c6fa2 100644 --- a/src/anbox/graphics/emugl/Renderer.cpp +++ b/src/anbox/graphics/emugl/Renderer.cpp @@ -622,7 +622,9 @@ void Renderer::performDelayedColorBufferCloseLocked() { m_colorBufferDelayedCloseList.begin(), it); } -void Renderer::closeColorBufferLocked(HandleType p_colorbuffer) { +// Attention!!! when call this function in an iteration of any set of +// m_procOwnedColorBuffers, you must set wannaClean to be false. +void Renderer::closeColorBufferLocked(HandleType p_colorbuffer, , bool wannaClean) { ColorBufferMap::iterator c(m_colorbuffers.find(p_colorbuffer)); if (c == m_colorbuffers.end()) { // This is harmless: it is normal for guest system to issue @@ -636,7 +638,9 @@ void Renderer::closeColorBufferLocked(HandleType p_colorbuffer) { m_colorBufferDelayedCloseList.push_back( {c->second.closedTs, p_colorbuffer}); } - performDelayedColorBufferCloseLocked(); + if (wannaClean) { + performDelayedColorBufferCloseLocked(); + } } void Renderer::closeColorBuffer(HandleType p_colorbuffer) @@ -666,7 +670,7 @@ void Renderer::cleanupProcGLObjects(int tid) { auto procIte = m_procOwnedColorBuffers.find(tid); if (procIte != m_procOwnedColorBuffers.end()) { for (auto cb: procIte->second) { - closeColorBufferLocked(cb); + closeColorBufferLocked(cb, false); } m_procOwnedColorBuffers.erase(procIte); } diff --git a/src/anbox/graphics/emugl/Renderer.h b/src/anbox/graphics/emugl/Renderer.h index 4acbe99888de5bb453126bb48758757a27b23005..5ba454826d6a173e61386e47303482075e69de84 100644 --- a/src/anbox/graphics/emugl/Renderer.h +++ b/src/anbox/graphics/emugl/Renderer.h @@ -179,7 +179,7 @@ class Renderer : public anbox::graphics::Renderer { // createColorBuffer(). Note that if the reference count reaches 0, // the instance is destroyed automatically. void closeColorBuffer(HandleType p_colorbuffer); - void closeColorBufferLocked(HandleType p_colorbuffer); + void closeColorBufferLocked(HandleType p_colorbuffer, bool wannaClean = true); void cleanupProcGLObjects(int tid); // Equivalent for eglMakeCurrent() for the current display.