Commit 81325a3f authored by Alexander Alekhin's avatar Alexander Alekhin

highgui(gtk): use recursive cv::Mutex for 'window_mutex' variable

parent aa0c6ddb
...@@ -597,10 +597,15 @@ int thread_started=0; ...@@ -597,10 +597,15 @@ int thread_started=0;
static gpointer icvWindowThreadLoop(gpointer data); static gpointer icvWindowThreadLoop(gpointer data);
GMutex* last_key_mutex = NULL; GMutex* last_key_mutex = NULL;
GCond* cond_have_key = NULL; GCond* cond_have_key = NULL;
GMutex* window_mutex = NULL;
GThread* window_thread = NULL; GThread* window_thread = NULL;
#endif #endif
static cv::Mutex& getWindowMutex()
{
static cv::Mutex* g_window_mutex = new cv::Mutex();
return *g_window_mutex;
}
static int last_key = -1; static int last_key = -1;
static std::vector< Ptr<CvWindow> > g_windows; static std::vector< Ptr<CvWindow> > g_windows;
...@@ -627,14 +632,14 @@ CV_IMPL int cvInitSystem( int argc, char** argv ) ...@@ -627,14 +632,14 @@ CV_IMPL int cvInitSystem( int argc, char** argv )
CV_IMPL int cvStartWindowThread(){ CV_IMPL int cvStartWindowThread(){
#ifdef HAVE_GTHREAD #ifdef HAVE_GTHREAD
cvInitSystem(0,NULL); cvInitSystem(0,NULL);
if (!thread_started) { if (!thread_started)
{
if (!g_thread_supported ()) { if (!g_thread_supported ()) {
/* the GThread system wasn't inited, so init it */ /* the GThread system wasn't inited, so init it */
g_thread_init(NULL); g_thread_init(NULL);
} }
// this mutex protects the window resources (void)getWindowMutex(); // force mutex initialization
window_mutex = g_mutex_new();
// protects the 'last key pressed' variable // protects the 'last key pressed' variable
last_key_mutex = g_mutex_new(); last_key_mutex = g_mutex_new();
...@@ -642,13 +647,13 @@ CV_IMPL int cvStartWindowThread(){ ...@@ -642,13 +647,13 @@ CV_IMPL int cvStartWindowThread(){
// conditional that indicates a key has been pressed // conditional that indicates a key has been pressed
cond_have_key = g_cond_new(); cond_have_key = g_cond_new();
#if !GLIB_CHECK_VERSION(2, 32, 0) #if !GLIB_CHECK_VERSION(2, 32, 0)
// this is the window update thread // this is the window update thread
window_thread = g_thread_create(icvWindowThreadLoop, window_thread = g_thread_create(icvWindowThreadLoop,
NULL, TRUE, NULL); NULL, TRUE, NULL);
#else #else
window_thread = g_thread_new("OpenCV window update", icvWindowThreadLoop, NULL); window_thread = g_thread_new("OpenCV window update", icvWindowThreadLoop, NULL);
#endif #endif
} }
thread_started = window_thread!=NULL; thread_started = window_thread!=NULL;
return thread_started; return thread_started;
...@@ -661,9 +666,10 @@ CV_IMPL int cvStartWindowThread(){ ...@@ -661,9 +666,10 @@ CV_IMPL int cvStartWindowThread(){
gpointer icvWindowThreadLoop(gpointer /*data*/) gpointer icvWindowThreadLoop(gpointer /*data*/)
{ {
while(1){ while(1){
g_mutex_lock(window_mutex); {
cv::AutoLock lock(getWindowMutex());
gtk_main_iteration_do(FALSE); gtk_main_iteration_do(FALSE);
g_mutex_unlock(window_mutex); }
// little sleep // little sleep
g_usleep(500); g_usleep(500);
...@@ -673,20 +679,10 @@ gpointer icvWindowThreadLoop(gpointer /*data*/) ...@@ -673,20 +679,10 @@ gpointer icvWindowThreadLoop(gpointer /*data*/)
return NULL; 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 #endif
#define CV_LOCK_MUTEX() cv::AutoLock lock(getWindowMutex())
static CvWindow* icvFindWindowByName( const char* name ) static CvWindow* icvFindWindowByName( const char* name )
{ {
for(size_t i = 0; i < g_windows.size(); ++i) for(size_t i = 0; i < g_windows.size(); ++i)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment