gdk_threads_enter is not reentrant
- From: Noel Burton-Krahn <noel burton-krahn com>
- To: gtk-list redhat com
- Subject: gdk_threads_enter is not reentrant
- Date: 6 Mar 2000 23:42:14 -0000
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
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]