I have a piece of code which may be run from a GTK callback or within
a thread outside of gtk_main().  The problem is that
gdk_threads_enter() is not reentrant.  It locks up if I call it within
a callback function.  If I omit the lock, I could trash GTK internals.

    MyData::destroy() {
        gdk_threads_enter();   // hangs if called withing a callback
        free_some_gdk_data();  // but I need to lock to protect GTK
        gdk_threads_leave();
    }

Could gdk_threads_enter() be made reentrant?  You should be able to
call it twice from the same thread without deadlock.  How about
something like this?

    pthread_mutex_t gdk_lock_mutex;
    int             gdk_lock_count;
    pthread_t       gdk_lock_thread;

    gdk_threads_enter() {
        if( gdk_lock_thread != pthread_self() ) {
            pthread_mutex_lock(gdk_lock_mutex);
            assert(gdk_lock_count == 0 && gdk_lock_thread == 0);
            gdk_lock_thread = pthread_self();
        }
        gdk_lock_count++;
    }

    gdk_threads_leave() {
        assert(gdk_lock_count > 0 && gdk_lock_thread == pthread_self());
        gdk_lock_count--;
        if( gdk_lock_count == 0 ) {
            pthread_mutex_unlock(gdk_lock_mutex);
            gdk_lock_thread = 0;
            gdk_lock_count = 0;
        }
    }

--Noel


-- 
To unsubscribe: mail -s unsubscribe [EMAIL PROTECTED] < /dev/null

Reply via email to