From: Capiez F. <fab...@ya...> - 2005-12-09 00:34:03
|
Hello List, I am trying to wrap to python a 3rd party library of which I have only the C DLL and the header file. Thanks to Swig, this ML, cstring.i and typemaps, I have wrapped 90% of the library and I am very glad about it since I had very little experience in C to begin with. My problem concerns the last 10% and I would like to know if there is a solution (I would sure hope there were since the library is rather crippled without it). The library is a comunication library between the computer and a measuring device. I have wrapped all the functions concerning configuration and synchron comunication but I hit a rock when I try to tackle asynchron comunication. The asynchron model of the library is event-driven and the user has to register Listener Functions to the listener manager which will send the event to them when required. The corresponding part of the header is : typedef unsigned int (*PFUNC)( const LibEvent* pLibEvent, unsigned long ClientData ); extern unsigned long RegisterListener( unsigned int handle_Connect, unsigned long DesiredEventType, PFUNC pfnListenerProc, unsigned long ClientData, unsigned int NormalPriority ); The unsigned int returned by the callback function is meant as a flag to determine whether the event is transmitted to the following listeners or not when the function is done with it My goal is eventually to enable Python functions to be used as call-back functions to manage the events but even the following simple test fails : (excerpt of MyModule.i) %{ unsigned int TestCallback(const LibEvent *pEvent, unsigned long ClientData) { return (unsigned int) 1; //does nothing, just to test } unsigned long MyRegister(unsigned int handle_Connect, unsigned long DesiredEventType, unsigned int NormalPriority) { unsigned long handle_Listener; handle_Listener= RegisterListener( handle_Connect,DesiredEventType, (PFUNC)TestCallback ,(unsigned long)128,0 ); return handle_Listener; } %} unsigned int TestCallback(const LibEvent *pEvent, unsigned long ListenerData); unsigned long MyRegister(unsigned int handle_Connect, unsigned long DesiredEventType, unsigned int NormalPriority); extern unsigned long RegisterListener( unsigned int handle_Connect, unsigned long DesiredEventType, PFUNC pfnListenerProc, unsigned long ClientData, unsigned int NormalPriority ); From Python, when I use MyModule.MyRegister(handle,INCOMING_MESSAGE,NORMAL_PRIORITY), the registering takes place without problem : I get a handle to the listener back and I can verify that the number of listeners affected to INCOMING_MESSAGE is indeed incremented to 1. However, if I use the measuring device to make a measurement and thus to send a message to the computer, Python crashes with no trace-back and I get the "Do you want to tell your whole life to Microsoft" dialog. If no listener is registered, the program does not crash when a measurement is transmitted to the computer. So my question is : Do you think it is possible to go around this problem ? By searching the mailing list archive and reading as well as I can understand the Python-C API, I would tend to think that it is related to the threads and the Global Iterpreter Lock. This said, I do not quite see what to do since if some C code had to be changed in order to take account of the Python GIL, It would be done in the DLL of which I have not the source, wouldn't it ? Or is there some Swig directives that enables the wrapped DLL to take care of this ? I would be happy if a week's worth of learning Swig and trying to wrap this library did not end in an unusable asynchron mode, crippling the rest of the project. Looking forward to receiving any input on the matter, Fabrice Capiez PS: I wondered for a while if this ML was more related to my problem than the general Python ML and came to the conclusion that I could not change the original DLL so if anything could be done, it was on the Swig side. Forgive me if I am wrong and you think that this message is irrelevent. -------------------------------------- STOP HIV/AIDS. Yahoo! JAPAN Redribbon Campaign 2005 http://pr.mail.yahoo.co.jp/redribbon/ |