[PythonCE] Non-Python threads crash on errno access

2006-06-27 Thread Kevin Goodsell
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

2006-06-27 Thread Smit, M.C.
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

2006-06-27 Thread Luke Dunstan

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]; pythonce@python.org
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: pythonce@python.org
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