Issue #4893: Use NT threading on CE.

This commit is contained in:
Martin v. Löwis 2009-01-12 08:11:24 +00:00
parent 1b3bef21b0
commit e3422fae8a
3 changed files with 28 additions and 7 deletions

View File

@ -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.

View 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

View 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