mirror of https://github.com/python/cpython
Issue #4893: Use NT threading on CE.
This commit is contained in:
parent
1b3bef21b0
commit
e3422fae8a
|
@ -12,6 +12,8 @@ What's New in Python 2.7 alpha 1
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #4893: Use NT threading on CE.
|
||||||
|
|
||||||
- Issue #4915: Port sysmodule to Windows CE.
|
- Issue #4915: Port sysmodule to Windows CE.
|
||||||
|
|
||||||
- Issue #4074: Change the criteria for doing a full garbage collection (i.e.
|
- Issue #4074: Change the criteria for doing a full garbage collection (i.e.
|
||||||
|
|
|
@ -137,10 +137,6 @@ static size_t _pythread_stacksize = 0;
|
||||||
#include "thread_beos.h"
|
#include "thread_beos.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WINCE_THREADS
|
|
||||||
#include "thread_wince.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PLAN9_THREADS
|
#ifdef PLAN9_THREADS
|
||||||
#include "thread_plan9.h"
|
#include "thread_plan9.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -106,8 +106,13 @@ typedef struct {
|
||||||
void *arg;
|
void *arg;
|
||||||
} callobj;
|
} 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
|
static unsigned __stdcall
|
||||||
|
#endif
|
||||||
bootstrap(void *call)
|
bootstrap(void *call)
|
||||||
{
|
{
|
||||||
callobj *obj = (callobj*)call;
|
callobj *obj = (callobj*)call;
|
||||||
|
@ -135,24 +140,38 @@ PyThread_start_new_thread(void (*func)(void *), void *arg)
|
||||||
return -1;
|
return -1;
|
||||||
obj->func = func;
|
obj->func = func;
|
||||||
obj->arg = arg;
|
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,
|
hThread = (HANDLE)_beginthreadex(0,
|
||||||
Py_SAFE_DOWNCAST(_pythread_stacksize,
|
Py_SAFE_DOWNCAST(_pythread_stacksize,
|
||||||
Py_ssize_t, unsigned int),
|
Py_ssize_t, unsigned int),
|
||||||
bootstrap, obj,
|
bootstrap, obj,
|
||||||
0, &threadID);
|
0, &threadID);
|
||||||
|
#endif
|
||||||
if (hThread == 0) {
|
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
|
/* I've seen errno == EAGAIN here, which means "there are
|
||||||
* too many threads".
|
* too many threads".
|
||||||
*/
|
*/
|
||||||
|
int e = errno;
|
||||||
dprintf(("%ld: PyThread_start_new_thread failed, errno %d\n",
|
dprintf(("%ld: PyThread_start_new_thread failed, errno %d\n",
|
||||||
PyThread_get_thread_ident(), errno));
|
PyThread_get_thread_ident(), e));
|
||||||
|
#endif
|
||||||
threadID = (unsigned)-1;
|
threadID = (unsigned)-1;
|
||||||
HeapFree(GetProcessHeap(), 0, obj);
|
HeapFree(GetProcessHeap(), 0, obj);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
dprintf(("%ld: PyThread_start_new_thread succeeded: %p\n",
|
dprintf(("%ld: PyThread_start_new_thread succeeded: %p\n",
|
||||||
PyThread_get_thread_ident(), (void*)hThread));
|
PyThread_get_thread_ident(), (void*)hThread));
|
||||||
/* wait for thread to initialize, so we can get its id */
|
|
||||||
CloseHandle(hThread);
|
CloseHandle(hThread);
|
||||||
}
|
}
|
||||||
return (long) threadID;
|
return (long) threadID;
|
||||||
|
@ -177,7 +196,11 @@ PyThread_exit_thread(void)
|
||||||
dprintf(("%ld: PyThread_exit_thread called\n", PyThread_get_thread_ident()));
|
dprintf(("%ld: PyThread_exit_thread called\n", PyThread_get_thread_ident()));
|
||||||
if (!initialized)
|
if (!initialized)
|
||||||
exit(0);
|
exit(0);
|
||||||
|
#if defined(MS_WINCE)
|
||||||
|
ExitThread(0);
|
||||||
|
#else
|
||||||
_endthreadex(0);
|
_endthreadex(0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NO_EXIT_PROG
|
#ifndef NO_EXIT_PROG
|
||||||
|
|
Loading…
Reference in New Issue