summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2009-01-12 08:11:24 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2009-01-12 08:11:24 (GMT)
commite3422fae8a38b04c216b7c777ad10694073c4937 (patch)
treeb32988521bf437775895584719ba0e61f6c358ce /Python
parent1b3bef21b061a1543591d6d67d5501a4469504e9 (diff)
downloadcpython-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.c4
-rw-r--r--Python/thread_nt.h29
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