From: Alexander Alekhin Date: Fri, 6 Jul 2018 14:06:01 +0000 (+0300) Subject: highgui(gtk): use recursive cv::Mutex for 'window_mutex' variable X-Git-Tag: accepted/tizen/6.0/unified/20201030.111113~1^2~606^2~4^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=81325a3fa0af9748c7a62e056d3ddec2cc6f78d9;p=platform%2Fupstream%2Fopencv.git highgui(gtk): use recursive cv::Mutex for 'window_mutex' variable --- diff --git a/modules/highgui/src/window_gtk.cpp b/modules/highgui/src/window_gtk.cpp index 07e683d..5ab7de8 100644 --- a/modules/highgui/src/window_gtk.cpp +++ b/modules/highgui/src/window_gtk.cpp @@ -597,10 +597,15 @@ int thread_started=0; static gpointer icvWindowThreadLoop(gpointer data); GMutex* last_key_mutex = NULL; GCond* cond_have_key = NULL; -GMutex* window_mutex = NULL; GThread* window_thread = NULL; #endif +static cv::Mutex& getWindowMutex() +{ + static cv::Mutex* g_window_mutex = new cv::Mutex(); + return *g_window_mutex; +} + static int last_key = -1; static std::vector< Ptr > g_windows; @@ -627,28 +632,28 @@ CV_IMPL int cvInitSystem( int argc, char** argv ) CV_IMPL int cvStartWindowThread(){ #ifdef HAVE_GTHREAD cvInitSystem(0,NULL); - if (!thread_started) { - if (!g_thread_supported ()) { - /* the GThread system wasn't inited, so init it */ - g_thread_init(NULL); - } - - // this mutex protects the window resources - window_mutex = g_mutex_new(); - - // protects the 'last key pressed' variable - last_key_mutex = g_mutex_new(); - - // conditional that indicates a key has been pressed - cond_have_key = g_cond_new(); - -#if !GLIB_CHECK_VERSION(2, 32, 0) - // this is the window update thread - window_thread = g_thread_create(icvWindowThreadLoop, - NULL, TRUE, NULL); -#else - window_thread = g_thread_new("OpenCV window update", icvWindowThreadLoop, NULL); -#endif + if (!thread_started) + { + if (!g_thread_supported ()) { + /* the GThread system wasn't inited, so init it */ + g_thread_init(NULL); + } + + (void)getWindowMutex(); // force mutex initialization + + // protects the 'last key pressed' variable + last_key_mutex = g_mutex_new(); + + // conditional that indicates a key has been pressed + cond_have_key = g_cond_new(); + + #if !GLIB_CHECK_VERSION(2, 32, 0) + // this is the window update thread + window_thread = g_thread_create(icvWindowThreadLoop, + NULL, TRUE, NULL); + #else + window_thread = g_thread_new("OpenCV window update", icvWindowThreadLoop, NULL); + #endif } thread_started = window_thread!=NULL; return thread_started; @@ -661,9 +666,10 @@ CV_IMPL int cvStartWindowThread(){ gpointer icvWindowThreadLoop(gpointer /*data*/) { while(1){ - g_mutex_lock(window_mutex); - gtk_main_iteration_do(FALSE); - g_mutex_unlock(window_mutex); + { + cv::AutoLock lock(getWindowMutex()); + gtk_main_iteration_do(FALSE); + } // little sleep g_usleep(500); @@ -673,20 +679,10 @@ gpointer icvWindowThreadLoop(gpointer /*data*/) return NULL; } - -class GMutexLock { - GMutex* mutex_; -public: - GMutexLock(GMutex* mutex) : mutex_(mutex) { if (mutex_) g_mutex_lock(mutex_); } - ~GMutexLock() { if (mutex_) g_mutex_unlock(mutex_); mutex_ = NULL; } -}; - -#define CV_LOCK_MUTEX() GMutexLock lock(window_mutex); - -#else -#define CV_LOCK_MUTEX() #endif +#define CV_LOCK_MUTEX() cv::AutoLock lock(getWindowMutex()) + static CvWindow* icvFindWindowByName( const char* name ) { for(size_t i = 0; i < g_windows.size(); ++i)