Blob Blame History Raw
From 83cc5eac26fdfbc3f1ddaea2eee3edb836a0838b Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Thu, 11 Aug 2022 23:15:33 +0200
Subject: [PATCH 3/5] gl_renderer: Protect pause/unpause against unbalanced
 calls

plee-the-bear calls unpause without calling pause first,
leading to an unbalanced mutex unlock.

This unbalanced mutex unlock triggers an assert when the mutex
gets destroyed when exiting plee-the-bear.

Protect pause/unpause against unbalanced calls to fix this.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 bear-engine/core/src/visual/code/gl_renderer.cpp | 13 +++++++++++++
 bear-engine/core/src/visual/gl_renderer.hpp      |  3 +++
 2 files changed, 16 insertions(+)

diff --git a/bear-engine/core/src/visual/code/gl_renderer.cpp b/bear-engine/core/src/visual/code/gl_renderer.cpp
index 4733f25..1b21bf9 100644
--- a/bear-engine/core/src/visual/code/gl_renderer.cpp
+++ b/bear-engine/core/src/visual/code/gl_renderer.cpp
@@ -503,12 +503,24 @@ void bear::visual::gl_renderer::set_background_color( const color_type& c )
 
 void bear::visual::gl_renderer::pause()
 {
+  boost::mutex::scoped_lock states_lock( m_mutex.loop_state );
+
+  if ( m_paused )
+    return;
+
   m_mutex.gl_access.lock();
+  m_paused = true;
 }
 
 void bear::visual::gl_renderer::unpause()
 {
+  boost::mutex::scoped_lock states_lock( m_mutex.loop_state );
+
+  if ( !m_paused )
+    return;
+
   m_mutex.gl_access.unlock();
+  m_paused = false;
 }
 
 /*----------------------------------------------------------------------------*/
@@ -972,6 +984,7 @@ bear::visual::gl_renderer::gl_renderer()
     m_viewport_size( m_view_size ),
     m_fullscreen( false ),
     m_video_mode_is_set( false ),
+    m_paused( false ),
     m_render_ready( false ),
     m_draw( nullptr ),
     m_capture_queue( nullptr )
diff --git a/bear-engine/core/src/visual/gl_renderer.hpp b/bear-engine/core/src/visual/gl_renderer.hpp
index 72cfe13..a9ee2d5 100644
--- a/bear-engine/core/src/visual/gl_renderer.hpp
+++ b/bear-engine/core/src/visual/gl_renderer.hpp
@@ -175,6 +175,9 @@ namespace bear
       /** \brief Tells if the window has been initialized. */
       bool m_video_mode_is_set;
 
+      /** \brief Tells if rendering is paused. */
+      bool m_paused;
+
       /** \brief The next elements to render. */
       state_list m_states;
       state_list m_previous_states;
-- 
2.37.1