[Pythonmac-SIG] Python threading.Thread vs PyObjC performOnMainThread
gandreas@gandreas.com
gandreas at gandreas.com
Mon May 16 22:29:35 CEST 2005
On May 16, 2005, at 2:39 PM, Ronald Oussoren wrote:
>
> On 16-mei-2005, at 21:28, gandreas at gandreas.com wrote:
>
>> The problem isn't the Cocoa threads (Cocoa knows that the
>> application is multithreaded). The problem is that the python
>> code that is executing in a threading.Thread calls
>> performSelectorOnMainThread to do the UI on the main thread
>> (which, since waits for that to complete, blocking the
>> interpreter). The selector called in turn tries to interpret
>> additional Python code, but can't because the lock is held by the
>> blocked threading.Thread and a simple case of deadlock occurs.
>>
>
> That should never occur. All calls into ObjC should give up the
> GIL. That is, during 'performSelectorOnMainThread' the GIL should
> be free for the taking, and the mail thread should be able to pick
> it up. If that doesn't work you ran into a bug in PyObjC (or python
> itself, we have had problems with GIL-related code in the past).
> You'd run into the same problem using NSThread.
>
I'm more than willing to admit that there is some other problem here
with threading, GIL, etc... and that what I'm seeing is only another
symptom of that bigger problem, because I just discovered that if I
do the "debug using the local interpreter and absolutely no extra
threads ever generated for anything" I get:
Fatal Python error: PyThreadState_Get: no current thread
so it's probably something bad as a result of updating to Tiger (I
know there was a perfectly fine main thread which way up the call
chain responded to the menu command to start debugging, executed a
boatload of python code, and then loaded a NIB and in that
awakeFromNib a call to PyImport_AddModule sent it screaming down to
SIGABRT land):
#0 0x9004a10c in kill ()
#1 0x90120934 in abort ()
#2 0x9879d774 in Py_FatalError ()
#3 0x9879a884 in PyThreadState_Get ()
#4 0x98791f48 in PyImport_GetModuleDict ()
#5 0x98792708 in PyImport_AddModule ()
#6 0x00008858 in -[PyInteractive awakeFromNib] (self=0x5800fa0,
_cmd=0x0) at /Volumes/YWork1/PyOXIDE/Source/PyInteractive.mm:130
#7 0x92886788 in -[NSSet makeObjectsPerformSelector:] ()
#8 0x93636174 in -[NSIBObjectData
nibInstantiateWithOwner:topLevelObjects:] ()
#9 0x9370cdc4 in old_loadNib ()
#10 0x93621fd0 in +[NSBundle(NSNibLoading)
_loadNibFile:nameTable:withZone:ownerBundle:] ()
#11 0x9367923c in +[NSBundle(NSNibLoading)
loadNibFile:externalNameTable:withZone:] ()
#12 0x9370cb68 in -[NSWindowController loadWindow] ()
#13 0x9370c88c in -[NSWindowController window] ()
#14 0x04a008f8 in _ffi_call_DARWIN () at /Users/ronald/Projects/
pyobjc-1.2/pyobjc/libffi-src/src/powerpc/darwin.S:118
#15 0x04a002ec in ffi_call (cif=0x0, fn=0x39, rvalue=0xa00042b0,
avalue=0xffffffff) at /Users/ronald/Projects/pyobjc-1.2/pyobjc/libffi-
src/src/powerpc/ffi_darwin.c:395
#16 0x049ebeac in PyObjCFFI_Caller (aMeth=0x5754368, self=0x5145d10,
args=0x0) at Modules/objc/libffi_support.m:1228
#17 0x049fca24 in objcsel_call (self=0x5754368, args=0x1759030) at
Modules/objc/selector.m:502
#18 0x9871e8e0 in PyObject_Call ()
#19 0x9877e35c in PyEval_GetFuncDesc ()
#20 0x9877dd4c in PyEval_GetFuncDesc ()
#21 0x9877b414 in PyEval_EvalCode ()
#22 0x9877c5e4 in PyEval_EvalCodeEx ()
#23 0x98733530 in PyFunction_SetClosure ()
#24 0x9871e8e0 in PyObject_Call ()
#25 0x049fd1dc in pysel_call (self=0x5130060, args=0x0, kwargs=0x0)
at Modules/objc/selector.m:958
#26 0x9871e8e0 in PyObject_Call ()
#27 0x9877e35c in PyEval_GetFuncDesc ()
#28 0x9877dd4c in PyEval_GetFuncDesc ()
#29 0x9877b414 in PyEval_EvalCode ()
#30 0x9877dedc in PyEval_GetFuncDesc ()
#31 0x9877dd34 in PyEval_GetFuncDesc ()
#32 0x9877b414 in PyEval_EvalCode ()
#33 0x9877c5e4 in PyEval_EvalCodeEx ()
#34 0x9877df90 in PyEval_GetFuncDesc ()
#35 0x9877dd34 in PyEval_GetFuncDesc ()
#36 0x9877b414 in PyEval_EvalCode ()
#37 0x9877dedc in PyEval_GetFuncDesc ()
#38 0x9877dd34 in PyEval_GetFuncDesc ()
#39 0x9877b414 in PyEval_EvalCode ()
#40 0x9877c5e4 in PyEval_EvalCodeEx ()
#41 0x98733530 in PyFunction_SetClosure ()
#42 0x9871e8e0 in PyObject_Call ()
#43 0x98726af4 in PyMethod_New ()
#44 0x9871e8e0 in PyObject_Call ()
#45 0x9871eb8c in PyObject_CallMethod ()
#46 0x0000b450 in -[NSDocument(NSDocumentPyHandler) pythonOnHandler:]
(self=0x512e1c0, _cmd=0x0, sender=0xa00042b0) at /Volumes/YWork1/
PyOXIDE/Source/NSDocumentPyHandler.mm:181
#47 0x936bd274 in -[NSApplication sendAction:to:from:] ()
#48 0x93717a70 in -[NSMenu performActionForItemAtIndex:] ()
#49 0x937177f4 in -[NSCarbonMenuImpl
performActionWithHighlightingForItemAtIndex:] ()
#50 0x9371729c in -[NSMenu performKeyEquivalent:] ()
#51 0x93716e7c in -[NSApplication _handleKeyEquivalent:] ()
#52 0x93620c70 in -[NSApplication sendEvent:] ()
#53 0x936185d0 in -[NSApplication run] ()
#54 0x93708e04 in NSApplicationMain ()
#55 0x00007944 in _start (argc=1, argv=0xbffff99c, envp=0xbffff9a4)
at /SourceCache/Csu/Csu-46/crt.c:267
#56 0x000077b8 in start ()
> It would be really helpful if you could test using PyObjC SVN head
> both with Python 2.3 and with Python 2.4.
>
It's on the list.
Glenn Andreas gandreas at gandreas.com
<http://www.gandreas.com/> oh my!
quadrium | build, mutate, evolve | images, textures, backgrounds, art
More information about the Pythonmac-SIG
mailing list