From 20815a788da7add3e40911f68262337b6eae906b Mon Sep 17 00:00:00 2001 From: ZhaoPengyuan Date: Thu, 15 Oct 2020 21:11:48 +0800 Subject: [PATCH] renderer: colorbuffer deletion Solve the problem of data synchronization access --- src/anbox/graphics/emugl/Renderer.cpp | 10 +++++++--- src/anbox/graphics/emugl/Renderer.h | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/anbox/graphics/emugl/Renderer.cpp b/src/anbox/graphics/emugl/Renderer.cpp index 57929aa..1e51f39 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 4acbe99..5ba4548 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. -- Gitee