Callback from c thread with ctypes

Lie Ryan lie.1296 at gmail.com
Sun Mar 8 10:40:32 EDT 2009


Victor Lin wrote:
> On 3月8日, 下午9時56分, "Diez B. Roggisch" <de... at nospam.web.de> wrote:
>> Victor Lin schrieb:
>>
>>
>>
>>> Hi,
>>> I am going to develop a c library binding with ctypes. That c library
>>> will call callback from worker threads it created. Here comes the
>>> problem : Will the GIL be acquired before it goes into Python
>>> function?
>>> I got a little try..
>>> DSPPROC = WINFUNCTYPE(None, DWORD, DWORD, c_void_p, DWORD, c_void_p)
>>> def test(handle, channel, buffer, length, user):
>>>     print handle, channel, buffer, length, user
>>> dsp = BASS_ChannelSetDSP(stream, DSPPROC(test), None, 123)
>>> I got "access violation" when I run it... It seems that the ctypes
>>> did't acquire GIL before it call the python callback. As the document
>>> says.
>>> WINFUNCTYPE will release GIL during the call
>>> But it does not mention callback about Python function? How about a
>>> call from another thread? Could somebody help me?
>> The releasing takes only place when entering a c-function. A
>> python-callback acquires the GIL, see callbacks.c in the python source.
>>
>> The access violation has nothing to do with that I presume, that's just
>> a general programming error as it happens with ctypes during development.
>>
>> Diez
> 
> Hi,
> 
> Thanks your replying, I try it again, found that my program only crash
> when I call it from python's IDLE. If I click it, namely execute it
> with python directly, it works fine. Why the program will crash within
> IDLE?

Usually because IDLE is written in python and Tkinter. IDLE doesn't give 
a completely isolated environment for your program to run in, this 
causes python program that uses Tkinter often causes various 
undescribable oddities.



More information about the Python-list mailing list