[Python-Dev] Extension modules, Threading, and the GIL

David Abrahams dave@boost-consulting.com
Mon, 30 Dec 2002 14:19:55 -0500


martin@v.loewis.de (Martin v. L=F6wis) writes:

> David Abrahams <dave@boost-consulting.com> writes:
>
>> I am not intimately familiar with Qt
>
> Ah, so Q is Qt :-)=20

I actually revealed that several messages back.

> Care to reveal what A and B are

A is some extension module written by one of my users, that calls Qt
but doesn't install any callbacks.

B is some extension module which uses PyQt, thus installs callbacks
which invoke Python.

> and which the callback is that caused a deadlock?

There was no deadlock, as I've said.  The symptom is that Python
complains at some point that there's no thread state.  It goes away if
A releases the GIL before calling into Qt, and reacquires the GIL
afterwards.  I speculate that the callback releases the GIL when it is
finished, so that when A returns to Python there is no current thread.
By that time, the callback has completed, so it's hard to know for
sure which one it was.

>> It sounded to me like Tim explained that it is possible but
>> unimplemented.
>
> Trying to channel Tim: All experts for this stuff have tried and
> failed; Mark Hammond has a sort-of solution which Tim believes to be
> strictly-speaking incorrect. While people may have thought they have
> a solution, it is troubling that nobody can remember what the
> solution is. Maybe the email signature just had not enough space to
> write it down :-)

Hmm, it seems as though a mutex-protected record of which thread is
currently holding the GIL should be enough to handle it.  There must
be subtle details which complicate the problem, e.g. that there's no
portable/reliable way to identify the current thread (?)

--=20
                       David Abrahams
   dave@boost-consulting.com * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution