[pygtk] gtk threads with a C extension module and callback
Kim Novak
kim at trdlnk.com
Thu Feb 16 06:26:53 WST 2006
Thanks! Your solution worked.
Kim
Gustavo J. A. M. Carneiro wrote:
> On Wed, 2006-02-01 at 10:19 -0600, Kim Novak wrote:
>
>> I am having an issue when I enable gtk threading (call
>> gtk.threads_init() then gtk.main()). I'm not actually running any other
>> threads yet but would like to, thus I have to call gtk.threads_init(). I
>> don't know if this is a pygtk, gtk, python issue or user ignorance.
>>
>> I've narrowed this down to a small example. The python code registers a
>> callback with the C extension module then calls gtk.main. The C
>> extension module registers a glib timeout event. When the timeout occurs
>> the C code invokes the Python callback. It works if I don't call
>> gtk.threads_init() and seg faults if I do.
>>
>>
>
>
> Check my pseudo-diff to your python callback wrapper for the fix:
>
>
>
>> /* The timeout event handler for gtk event loop */
>> gint
>> on_timeout(gpointer data)
>> {
>> PyObject *arglist;
>> PyObject *result;
>>
> + PyGILState_STATE state;
> +
> + state = pyg_gil_state_ensure();
>
>
>> /* Time to call the callback */
>> arglist = Py_BuildValue("(i)", ++counter);
>> result = PyEval_CallObject(my_callback, arglist);
>> Py_DECREF(arglist);
>>
>
> + if (!result)
> + PyErr_Print();
> - Py_DECREF(result);
> + Py_XDECREF(result);
> + pyg_gil_state_release(state);
>
>
>> return 1;
>> }
>>
>>
>
>
More information about the pygtk
mailing list