diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2009-01-12 08:11:24 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2009-01-12 08:11:24 (GMT) |
commit | e3422fae8a38b04c216b7c777ad10694073c4937 (patch) | |
tree | b32988521bf437775895584719ba0e61f6c358ce /Python | |
parent | 1b3bef21b061a1543591d6d67d5501a4469504e9 (diff) | |
download | cpython-e3422fae8a38b04c216b7c777ad10694073c4937.zip cpython-e3422fae8a38b04c216b7c777ad10694073c4937.tar.gz cpython-e3422fae8a38b04c216b7c777ad10694073c4937.tar.bz2 |
Issue #4893: Use NT threading on CE.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/thread.c | 4 | ||||
-rw-r--r-- | Python/thread_nt.h | 29 |
2 files changed, 26 insertions, 7 deletions
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 |