Need some help with Python/C api and threading
Thomas Heller
theller at python.net
Thu Jun 17 11:58:46 EDT 2004
More information about the Python-list mailing list
Thu Jun 17 11:58:46 EDT 2004
- Previous message (by thread): Need some help with Python/C api and threading
- Next message (by thread): Need some help with Python/C api and threading
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
>>>>>> "Steve" == Steve Menard <steve.menard at videotron.ca> writes: > > Steve> Here is my problem. I have this library thats hosts > Steve> another language within python, and allows that language to > Steve> call back INTO python. > > Steve> All is good as long as the other languages calls back on > Steve> the same thread. If the callback arrives on a different > Steve> thread, all hell break loose and the program dies horribly. > > Steve> looking at the C api documentation, I came upon the > Steve> following block of code : > > Steve> PyThreadState *tstate; PyObject *result; > > Steve> /* interp is your reference to an interpreter > Steve> object. */ tstate = PyThreadState_New(interp); > Steve> PyEval_AcquireThread(tstate); > > Steve> /* Perform Python actions here. */ result = > Steve> CallSomeFunction(); /* evaluate result */ > > Steve> /* Release the thread. No Python API allowed beyond > Steve> this point. */ PyEval_ReleaseThread(tstate); > > Steve> /* You can either delete the thread state, or save it > Steve> until you need it the next time. */ > Steve> PyThreadState_Delete(tstate); > > > Steve> Which would seem to be what I need. However, I have no idea > Steve> how to get at that interp pointer. I tried the following : > > Steve> PyInterpreterState* interp = > Steve> PyInterpreterState_New(); PyThreadState *tstate = > Steve> PyThreadState_New(interp); PyEval_AcquireThread(tstate); > > Steve> but then it crashes on the second line ... > > Steve> Anybody ever done this? As a side note, the hosted language > Steve> can start an arbitrary number of threads ... > > Steve> Steve If your library is a Python extension, you should get and save the PyInterpreterState in the initxxx() function, which initializes the extension. If using Python 2.3 you could (should?) probably use the PyGILState_Ensure() and PyGILState_Release() functions, which manage all this for you. See PEP311 http://www.python.org/peps/pep-0311.html. Maybe also it is needed to call PyEval_InitThreads() somewhere in the init function. Thomas
- Previous message (by thread): Need some help with Python/C api and threading
- Next message (by thread): Need some help with Python/C api and threading
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list