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<CvWindow> > g_windows;
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;
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);
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)