[pygtk] Python/C and Gtk threading

Gustavo J. A. M. Carneiro gjc at inescporto.pt
Mon Oct 17 19:11:25 WST 2005


  In your C callbacks that call python code, you have to put 
pyg_gil_state_ensure and pyg_gil_state_release around the python calls.
Look for examples in pygtk code..

On Mon, 2005-10-17 at 17:13 +1000, Nigel Tao wrote:
> I have written a Python binding [1] to Tomboy's global keybinding code
> (written in C).  And it all works fine.  Mostly.
> 
> If my python app calls
> 	gtk.gdk.threads_init()
> earlier, however, then it segfaults somewhere in the PyEval_CallObject
> of:
> --------------------
> void handler_c_func (char *keystring, gpointer user_data)
> {
> 	Handler_and_Args *ha = (Handler_and_Args *) user_data;
> 	PyObject *result = PyEval_CallObject(ha->handler, ha->args);
> 	if (result == NULL) {
> 		if (PyErr_Occurred()) {
> 			PyErr_Print();
> 		}
> 	} else {
> 		Py_DECREF(result);
> 	}
> }
> --------------------
> 
> If I add gdk_threads_enter() and gdk_threads_leave() just before and
> after the "PyObject *result = ..." line, then it doesn't segfault, but
> just blocks at the gdk_threads_enter.  I tried messing around with
> Py_BEGIN_ALLOW_THREADS, and alternatively having handler_c_func calling
> g_idle_add, but both of those didn't seem to work.
> 
> Any ideas?
> 
> Thanks in advance,
> Nigel.
> 
> 
> [1] http://cvs.gnome.org/viewcvs/deskbar-applet/deskbar/keybinder/
> _______________________________________________
> pygtk mailing list   pygtk at daa.com.au
> http://www.daa.com.au/mailman/listinfo/pygtk
> Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/
-- 
Gustavo J. A. M. Carneiro
<gjc at inescporto.pt> <gustavo at users.sourceforge.net>
The universe is always one step beyond logic.



More information about the pygtk mailing list