On Wed, 25 Jun 2003, Elliot Lee wrote:

> The problem is that pygdk_block_threads assumes that an accompanying
> pygdk_unblock_threads has previously been called, when in fact it hasn't.  
> This can happen in situations when a thread calls a non-thread-wrapped gtk
> function that emits a signal (e.g. gtk_entry_set_text()), and that signal
> is connected to a python function.

The attached patch seems to fix this particular problem.

> On a related note, pygdk_{block,unblock}_threads should really call 
> gdk_threads_{leave,enter} for sanity's sake.

This still is an issue - I can't just put the calls into 
pygdk_{block,unblock}_threads.
-- Elliot
Humpty Dumpty was pushed.
--- pygtk-1.99.16/gtk/gdk.override.sopwith      2003-06-26 10:41:28.000000000 -0400
+++ pygtk-1.99.16/gtk/gdk.override      2003-06-26 16:42:52.000000000 -0400
@@ -68,36 +68,48 @@
 static GStaticPrivate lock_count_key = G_STATIC_PRIVATE_INIT;
 static PyInterpreterState *pyinterpstate = NULL;
 
+static gint *
+pygdk_get_lock_count(void)
+{
+    gint *lock_count = g_static_private_get(&lock_count_key);
+
+    if(!lock_count)
+       {
+           lock_count = g_malloc(sizeof(gint));
+           *lock_count = 1;
+           g_static_private_set(&lock_count_key, lock_count, NULL);
+       }
+
+    return lock_count;
+}
+
 static void
 pygdk_block_threads (void)
 {
-    gint lock_count = GPOINTER_TO_INT(g_static_private_get(&lock_count_key));
-
-    if (lock_count == 0) {
-        PyThreadState *_save;
+    PyThreadState *_save;
+    gint *lock_count = pygdk_get_lock_count();
 
-       _save = g_static_private_get(&pythreadstate_key);
-        if (_save == NULL) {
-            _save = PyThreadState_New(pyinterpstate);
-       }
-       Py_BLOCK_THREADS;
-    }                                                                     
-    lock_count++;
-    g_static_private_set(&lock_count_key, GINT_TO_POINTER(lock_count), NULL);
+    (*lock_count)++;
+    if(*lock_count == 1)
+       {
+           _save = g_static_private_get(&pythreadstate_key);
+           g_assert(_save);
+           Py_BLOCK_THREADS;
+           g_static_private_set(&pythreadstate_key, NULL, NULL);
+       }
 }
+
 static void
 pygdk_unblock_threads (void)
 {
-    gint lock_count = GPOINTER_TO_INT(g_static_private_get(&lock_count_key));
-
-    lock_count--;
-    if (lock_count == 0) {
-        PyThreadState *_save;
+    PyThreadState *_save;
+    gint *lock_count = pygdk_get_lock_count();
 
+    if(*lock_count == 1) {
        Py_UNBLOCK_THREADS;
        g_static_private_set(&pythreadstate_key, _save, NULL);
     }
-    g_static_private_set(&lock_count_key, GINT_TO_POINTER(lock_count), NULL);
+    (*lock_count)--;
 }
 #endif
 
@@ -110,7 +122,6 @@
 
     PyEval_InitThreads();
     gdk_threads_init();
-    g_static_private_set(&lock_count_key, GINT_TO_POINTER(1), NULL);
 
     pyinterpstate = PyThreadState_Get()->interp;
 
_______________________________________________
pygtk mailing list   [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to