Python readline hooks and threading

Jake McGuire jamcguir at yahoo.com
Mon Feb 4 23:15:18 CET 2002


I'm a bit confused about how the readline module (Modules/readline.c)
is supposed to work, especially with regards to threading.  It *looks*
like the code is broken, and my own testing seems to bear this out,
but I think I may just be confused.

In the most recent version of readline.c [1], there is a comment in
on_hook() that says "Note that readline is called with the interpreter
lock released", followed immediately by a call to
PyThreadState_Swap().  The Python documentation says that the lock
must be held during any calls to PyThreadState_Swap, and looking at
the source shows that PyThreadState_Swap is indeed not thread-safe,
accessing a global variable without any locking.

In my application (multi-threaded, with all threads using C extension
functions and one thread using readline hooks) I was getting all kinds
of tstate mix-up errors.  Debugging showed that although readline is
indeed always called inside of a Py_BEGIN_ALLOW_THREADS block,
sometimes the call to PyThreadState_Swap() returned a non-null value. 
Commenting out the calls to PyThreadState_Swap() in on_hook seemed to
make these go away.

Is this a bug in the current Python distributions, or am I just on
crack?

-jake

[1] http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/python/python/dist/src/Modules/readline.c?rev=2.42&content-type=text/vnd.viewcvs-markup



More information about the Python-list mailing list