From 97ac59cb73cc2e9bebadb004023abdce815c33ff Mon Sep 17 00:00:00 2001 From: Roman Donchenko Date: Tue, 29 Mar 2016 14:06:05 +0300 Subject: [PATCH] Fix a memory leak indirectly caused by cvDestroyWindow --- modules/highgui/src/window_gtk.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/modules/highgui/src/window_gtk.cpp b/modules/highgui/src/window_gtk.cpp index c91e27d461..bb692249c0 100644 --- a/modules/highgui/src/window_gtk.cpp +++ b/modules/highgui/src/window_gtk.cpp @@ -1007,13 +1007,33 @@ static void icvDeleteWindow( CvWindow* window ) } cvFree( &window ); + + // if last window... + if( hg_windows == 0 ) + { #ifdef HAVE_GTHREAD - // if last window, send key press signal - // to jump out of any waiting cvWaitKey's - if(hg_windows==0 && thread_started){ - g_cond_broadcast(cond_have_key); - } + if( thread_started ) + { + // send key press signal to jump out of any waiting cvWaitKey's + g_cond_broadcast( cond_have_key ); + } + else + { #endif + // Some GTK+ modules (like the Unity module) use GDBusConnection, + // which has a habit of postponing cleanup by performing it via + // idle sources added to the main loop. Since this was the last window, + // we can assume that no event processing is going to happen in the + // nearest future, so we should force that cleanup (by handling all pending + // events) while we still have the chance. + // This is not needed if thread_started is true, because the background + // thread will process events continuously. + while( gtk_events_pending() ) + gtk_main_iteration(); +#ifdef HAVE_GTHREAD + } +#endif + } }