multi-threaded c++ callback problem
Ames Andreas
Andreas.Ames at comergo.com
Fri May 12 09:24:07 EDT 2006
> -----Original Message-----
> From: python-list-bounces+andreas.ames=comergo.com at python.org
> [mailto:python-list-bounces+andreas.ames=comergo.com at python.or
> g] On Behalf Of pydev
> Sent: Tuesday, April 11, 2006 9:23 PM
> Subject: multi-threaded c++ callback problem
>
> void pyCallEventCallback( CALL hCall,
> LINE hLine,
> CALLSTATE_MAJOR eMajor,
> CALLSTATE_MINOR eMinor,
> PyObject* def )
> {
> if( !PyCallable_Check( def ) )
> {
> PyErr_SetString( PyExc_TypeError, "Need a callable object!" );
> return;
> }
> printf( "EventCallback hCall: %i, hLine: %i, eMajor: %i,
> eMinor: %i\n", hCall, hLine, eMajor, eMinor);
> PyObject* arglist = Py_BuildValue("(iiii)", hCall, hLine,
> eMajor, eMinor);
>
> // if i comment out next line it works!
> PyEval_CallObject( def, arglist );
>
> Py_XDECREF(arglist);
> }
> //-----------------------------------------------------------//
Wild guess because of lack of context:
It's a race condition because you haven't acquired the GIL before calling pyCallEventCallback. You can do so by using PyEval_SaveThread and friends. You have to make sure to call PyEval_InitThreads somewhere, e.g. when embedding from within the interpreter initialisation boilerplate, when extending for instance from within the extension module initialisation.
cheers,
aa
--
Andreas Ames | Programmer | Comergo GmbH |
Voice: +49 69 7505 3213 | ames AT avaya . com
More information about the Python-list
mailing list