diff options
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Python/thread.c | 4 | ||||
-rw-r--r-- | Python/thread_nt.h | 29 |
3 files changed, 28 insertions, 7 deletions
@@ -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. diff --git a/Python/thread.c b/Python/thread.c index 03580f3..ff571d8 100644 --- a/Python/thread.c +++ b/Python/thread.c @@ -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 diff --git a/Python/thread_nt.h b/Python/thread_nt.h index e0457a2..633fe40 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -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 |