Why is SETUP_FINALLY uninterruptable[sic]?
Jeff Epler
jepler at unpythonic.net
Tue Aug 17 21:56:47 EDT 2004
Well, it's not an answer per se, but this block of code was added at the
same time as PyThreadState_SetAsyncExc, which is a C API to allow
raising an exception from an arbitrary thread.
http://cvs.sourceforge.net/viewcvs.py/python/python/dist/src/Python/ceval.c#rev2.366
I suspect that this has something to do with code like
l = some_lock()
l.acquire()
# MARK
try:
something with l held
finally:
l.release()
If an asynchronous exception happens betwen l.acquire() and the
SETUP_FINALLY opcode (at "MARK") , there's no guarantee that l.release()
is executed.
This state of affairs always existed with KeyboardInterrupt and/or
signals, and it's hard to see how this fixes the problem if l.acquire()
is Python code, but I think that's what's going on.
The special magic is only applied to SETUP_FINALLY because try: except:
isn't used for this kind of resource management.
This is all guesswork, though.
Jeff
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/python-list/attachments/20040817/ec540610/attachment.sig>
More information about the Python-list
mailing list