From 774a36efc91e82ccec436f14d0e194eaa726701a Mon Sep 17 00:00:00 2001 From: David Capello Date: Sat, 3 May 2014 18:02:27 -0300 Subject: [PATCH] Fix crash using deleted concurrent queue of event when Alleg4Display() is being destroyed --- src/she/she_alleg4.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/she/she_alleg4.cpp b/src/she/she_alleg4.cpp index 92b55d2c6..0725d7a6d 100644 --- a/src/she/she_alleg4.cpp +++ b/src/she/she_alleg4.cpp @@ -179,6 +179,7 @@ private: namespace { +base::mutex unique_display_mutex; Display* unique_display = NULL; int display_scale; @@ -189,7 +190,9 @@ bool display_has_mouse = false; static void queue_event(Event& ev) { - static_cast(unique_display->getEventQueue())->queueEvent(ev); + base::scoped_lock hold(unique_display_mutex); + if (unique_display) + static_cast(unique_display->getEventQueue())->queueEvent(ev); } static LRESULT CALLBACK wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) @@ -452,16 +455,21 @@ public: } ~Alleg4Display() { - delete m_queue; + // Put "unique_display" to null so queue_event() doesn't use + // "m_queue" anymore. + { + base::scoped_lock hold(unique_display_mutex); + unique_display = NULL; + } #if WIN32 unsubclass_hwnd((HWND)nativeHandle()); #endif + delete m_queue; + m_surface->dispose(); set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); - - unique_display = NULL; } void dispose() OVERRIDE {