]> granicus.if.org Git - python/commitdiff
Issue #4893: Use NT threading on CE.
authorMartin v. Löwis <martin@v.loewis.de>
Mon, 12 Jan 2009 08:11:24 +0000 (08:11 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Mon, 12 Jan 2009 08:11:24 +0000 (08:11 +0000)
Misc/NEWS
Python/thread.c
Python/thread_nt.h

index b4055ec5f65a4d08ff82f7dcd00ad03517bceb9c..517984e65e061fbf5c8a5e99d622f3d1d3702377 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.7 alpha 1
 Core and Builtins
 -----------------
 
+- Issue #4893: Use NT threading on CE.
+
 - Issue #4915: Port sysmodule to Windows CE.
 
 - Issue #4074: Change the criteria for doing a full garbage collection (i.e.
index 03580f382d3be18175a1f985e92e8530255dff15..ff571d837abe687fee640009602e269af517382d 100644 (file)
@@ -137,10 +137,6 @@ static size_t _pythread_stacksize = 0;
 #include "thread_beos.h"
 #endif
 
-#ifdef WINCE_THREADS
-#include "thread_wince.h"
-#endif
-
 #ifdef PLAN9_THREADS
 #include "thread_plan9.h"
 #endif
index e0457a2486d4ff1121fe66f5a1ac723d829c340b..633fe4018fcbfc8f46af6321fb6289aee511e310 100644 (file)
@@ -106,8 +106,13 @@ typedef struct {
        void *arg;
 } callobj;
 
-/* thunker to call a __cdecl function instead of a __stdcall */
+/* thunker to call adapt between the function type used by the system's
+thread start function and the internally used one. */
+#if defined(MS_WINCE)
+static DWORD WINAPI
+#else
 static unsigned __stdcall
+#endif
 bootstrap(void *call)
 {
        callobj *obj = (callobj*)call;
@@ -135,24 +140,38 @@ PyThread_start_new_thread(void (*func)(void *), void *arg)
                return -1;
        obj->func = func;
        obj->arg = arg;
+#if defined(MS_WINCE)
+       hThread = CreateThread(NULL,
+                              Py_SAFE_DOWNCAST(_pythread_stacksize, Py_ssize_t, SIZE_T),
+                              bootstrap, obj, 0, &threadID);
+#else
        hThread = (HANDLE)_beginthreadex(0,
                          Py_SAFE_DOWNCAST(_pythread_stacksize,
                                           Py_ssize_t, unsigned int),
                          bootstrap, obj,
                          0, &threadID);
+#endif
        if (hThread == 0) {
+#if defined(MS_WINCE)
+               /* Save error in variable, to prevent PyThread_get_thread_ident
+                  from clobbering it. */
+               unsigned e = GetLastError();
+               dprintf(("%ld: PyThread_start_new_thread failed, win32 error code %u\n",
+                        PyThread_get_thread_ident(), e));
+#else
                /* I've seen errno == EAGAIN here, which means "there are
                 * too many threads".
                 */
+               int e = errno;
                dprintf(("%ld: PyThread_start_new_thread failed, errno %d\n",
-                        PyThread_get_thread_ident(), errno));
+                        PyThread_get_thread_ident(), e));
+#endif
                threadID = (unsigned)-1;
                HeapFree(GetProcessHeap(), 0, obj);
        }
        else {
                dprintf(("%ld: PyThread_start_new_thread succeeded: %p\n",
                         PyThread_get_thread_ident(), (void*)hThread));
-               /* wait for thread to initialize, so we can get its id */
                CloseHandle(hThread);
        }
        return (long) threadID;
@@ -177,7 +196,11 @@ PyThread_exit_thread(void)
        dprintf(("%ld: PyThread_exit_thread called\n", PyThread_get_thread_ident()));
        if (!initialized)
                exit(0);
+#if defined(MS_WINCE)
+       ExitThread(0);
+#else
        _endthreadex(0);
+#endif
 }
 
 #ifndef NO_EXIT_PROG