Mercurial > cpython-lru_cache-weakref
diff Python/thread_nt.h @ 50744:8540268040ff legacy-trunk
Issue #4893: Use NT threading on CE.
| author | Martin v. Löwis <martin@v.loewis.de> |
|---|---|
| date | Mon, 12 Jan 2009 08:11:24 +0000 |
| parents | 5302f806537a |
| children | df5719c298db |
line wrap: on
line diff
--- a/Python/thread_nt.h Mon Jan 12 07:57:11 2009 +0000 +++ b/Python/thread_nt.h Mon Jan 12 08:11:24 2009 +0000 @@ -106,8 +106,13 @@ 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 @@ 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 @@ 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
