[PythonCE] Non-Python threads crash on errno access
We have a scenario where a Python program uses a C++ module. The C++ module creates its own threads, and these threads sometimes call back into Python (after first acquiring the GIL, of course). This works quite nicely on Linux and desktop Windows, but crashes on CE. After some debugging I discovered the cause: PythonCE uses its own errno macro which pulls a pointer out of thread-local storage and dereferences it. This works fine if the thread was started in Python, since new threads have a valid address placed into the thread-local storage slot. Non-Python threads, however, have the default initial value for the slot which happens to be zero, so dereferencing it crashes the program. As far as I can tell, there is no way to work around this that does not involve modifying the PythonCE source. I think we need some call we can make to initialize the thread-local storage for a non-Python thread. The solution is complicated somewhat by the fact that I want to be able to initialize the same thread multiple times without breaking it. The reason for this probably requires some explanation. The straight-forward approach would be to have any new non-Python thread call an initialization function when it starts, then call a de-register function when it finishes (just like Python threads currently do). This approach falls short because it assumes that the creator of a thread knows whether or not that thread will ever call Python. This makes it impossible to take a general-purpose, Python-agnostic C++ module that uses threads and a callback mechanism and expose it to Python in a way that allows callbacks to be written in Python. Because of this, the only sensible approach is to surround the call into Python with our register-thread and de-register-thread functions. This is really not an extra burden, because we already have to surround it with the GIL-acquiring and releasing functions. Now, assume that a thread created in C++ calls into Python, which calls back into C++, which calls into Python again. Since the calls into Python are surrounded by the thread registration/de-registration functions, the registration needs to be smart enough to do nothing the second time, and only de-register the last time. I think I have a solution, but it's not very nice. I'd like to see some suggestions about how to handle this in a more elegant way, and hopefully a permanent solution added to the official distribution. Thanks. -Kevin ___ PythonCE mailing list PythonCE@python.org http://mail.python.org/mailman/listinfo/pythonce
Re: [PythonCE] building a 'simple' example
Giovanni Petrucciani wrote: >Smit, M.C. wrote: >> Hi >> >> The path is in sys.path. The DLL is next to the test programme that tries to >> >import it, it name is simple.dll, andthe error is raised on: import simple >> >> ImportError: DLL load failed:The specified module could not be found. >> >Just to catch a possible simple bug: did you rename the dll ? >I had problems when I was compiling sqlite, because I did build the dll >with a wrong name with EVC and then renamed it, >but dll have their name coded also inside and so it was not working. > > Giovanni Hi Giovanni Thanks for your hint but the dll was not renamed. (I did try changeing the extention to .pyd but that didn't help either) cheers ___ PythonCE mailing list PythonCE@python.org http://mail.python.org/mailman/listinfo/pythonce
Re: [PythonCE] building a 'simple' example
Hi, I think the only way I could help further is if you posted a small but complete example that demonstrates the problem. Luke - Original Message - From: "Smit, M.C." <[EMAIL PROTECTED]> To: "Luke Dunstan" <[EMAIL PROTECTED]>; Sent: Monday, June 26, 2006 3:40 PM Subject: RE: [PythonCE] building a 'simple' example Hi The path is in sys.path. The DLL is next to the test programme that tries to import it, it name is simple.dll, andthe error is raised on: import simple ImportError: DLL load failed:The specified module could not be found. I'm running an winXP computer and an Ipac PDA winMobile 2003 thanks for your thoughts -Original Message- From: [EMAIL PROTECTED] on behalf of Luke Dunstan Sent: Fri 6/23/2006 6:04 PM To: pythonce@python.org Cc: Subject: Re: [PythonCE] building a 'simple' example Hi, Where did you put the DLL? What is it called? What were the commands that failed? Luke - Original Message - From: "Smit, M.C." <[EMAIL PROTECTED]> To: Sent: Friday, June 23, 2006 11:21 PM Subject: [PythonCE] building a 'simple' example > Dear all > > While there have been some posts on this topic I don't believe the answer > is in there jet. > > Eventually I want to write (with help of a colliegue whom is experienced > in c) a module that can use a device. Some c libraries are available, and > all I realy need is a function that returns an Int or String when called. > > I am trying to to build and run Listing 29-1 from the Python bible, > but so far I have been unable to compile annything that will work. > MS eVC is installed, and it compiles and links with no errors or warnings. > but when I put the dll on the PDA, and run a test program all I get is an > > ImportError: DLL load failed:The specified module could not be found. > > it can clearly find the file couse it knows it is a dll. I'm hoplessly > lost on what could be wrong, does annyone have any ideas. > > Cheers > > > here is the code: > // simple.cpp : Defines the entry point for the DLL application. > // > > #include "Python.h" > > static PyObject *simple_add(PyObject *pSelf, PyObject *pArgs) > { > PyObject *pX, *pY; > > if (!PyArg_ParseTuple(pArgs, "OO", &pX, &pY)) > return NULL; > > return PyNumber_Add(pX, pY); > } > > static char count_doc[] = "returns the number of arguments passed in"; > > static PyObject *simple_count(PyObject *pSelf, PyObject *pArgs) > { > long count = PyTuple_Size(pArgs); > return PyInt_FromLong(count); > } > > static PyMethodDef simple_methods[] = > { > {"add", simple_add, METH_VARARGS, NULL}, > {"count", simple_count, METH_VARARGS, count_doc}, > {NULL, NULL} > }; > > DL_EXPORT(void) initsimple() > { > Py_InitModule("simple", simple_methods); > } ___ PythonCE mailing list PythonCE@python.org http://mail.python.org/mailman/listinfo/pythonce ___ PythonCE mailing list PythonCE@python.org http://mail.python.org/mailman/listinfo/pythonce
Re: [PythonCE] Problem with ctypes
I also had the same problem with the ctypes 0.9.9.6 module from the ctypes project. I couldn't load the .pyd file directly either regardless of the location of the file. Changing to the ctypes module from the pythonce project made the problem go away for me as well. I did notice in the ctypes project that there are explicit releases for 2.3 and 2.4 for win32, but there is only one release for wince-arm, and no idication if it's for 2.3 or 2.4. Is there any way to tell what version of Python a particular .pyd file is built for without installing different python versions? Craig --- Luke Dunstan <[EMAIL PROTECTED]> wrote: > > - Original Message - > From: "Tod Haren" <[EMAIL PROTECTED]> > To: > Sent: Saturday, June 24, 2006 11:07 AM > Subject: [PythonCE] Problem with ctypes > > > > The wince files on the ctypes sourceforge project > site don't work for > > me. import ctypes was resulting in "import error: > dll load failed". > > I claimed to be unable to locate _ctypes.pyd even > though it was > > present and in sys.path. I tried both 0.9.9.6 and > 0.9.9.3 with no > > luck, I tried different paths and configurations > too. > > What was the name of the file you downloaded from > the ctypes project? Are > you sure it wasn't for Python 2.3? > > Luke > > > > > I finally checked the the pythonce project and > downloaded the 0.9.9.6 > > files from there. They worked like a charm and > now I'm up and running > > ctypes again. > > > > I have Python 2.4.3 running on a Dell Axim X5 with > PPC 2003, installed > > to the SD Card. > > > > Has anyone else had similar problems? > > > > Tod > ___ > PythonCE mailing list > PythonCE@python.org > http://mail.python.org/mailman/listinfo/pythonce > __ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com ___ PythonCE mailing list PythonCE@python.org http://mail.python.org/mailman/listinfo/pythonce