/* This code implemented by Mark Hammond (MHammond@skippinet.com.au) */#include <windows.h>#include <limits.h>#include <pydebug.h>long PyThread_get_thread_ident(void);/** Change all headers to pure ANSI as no one will use K&R style on an* NT*//** Initialization of the C package, should not be needed.*/static void PyThread__init_thread(void){}/** Thread support.*/long PyThread_start_new_thread(void (*func)(void *), void *arg){long rv;int success = -1;dprintf(("%ld: PyThread_start_new_thread called\n", PyThread_get_thread_ident()));if (!initialized)PyThread_init_thread();rv = _beginthread(func, 0, arg); /* use default stack size */if (rv != -1) {success = 0;dprintf(("%ld: PyThread_start_new_thread succeeded:\n", PyThread_get_thread_ident()));}return success;}/** Return the thread Id instead of an handle. The Id is said to uniquely identify the* thread in the system*/long PyThread_get_thread_ident(void){if (!initialized)PyThread_init_thread();return GetCurrentThreadId();}static void do_PyThread_exit_thread(int no_cleanup){dprintf(("%ld: do_PyThread_exit_thread called\n", PyThread_get_thread_ident()));if (!initialized)if (no_cleanup)exit(0); /* XXX - was _exit()!! */elseexit(0);_endthread();}void PyThread_exit_thread(void){do_PyThread_exit_thread(0);}void PyThread__exit_thread(void){do_PyThread_exit_thread(1);}#ifndef NO_EXIT_PROGstatic void do_PyThread_exit_prog(int status, int no_cleanup){dprintf(("PyThread_exit_prog(%d) called\n", status));if (!initialized)if (no_cleanup)_exit(status);elseexit(status);}void PyThread_exit_prog(int status){do_PyThread_exit_prog(status, 0);}void PyThread__exit_prog(int status){do_PyThread_exit_prog(status, 1);}#endif /* NO_EXIT_PROG *//** Lock support. It has to be implemented using Mutexes, as* CE doesnt support semaphores. Therefore we use some hacks to* simulate the non reentrant requirements of Python locks*/PyThread_type_lock PyThread_allocate_lock(void){HANDLE aLock;dprintf(("PyThread_allocate_lock called\n"));if (!initialized)PyThread_init_thread();aLock = CreateEvent(NULL, /* Security attributes */0, /* Manual-Reset */1, /* Is initially signalled */NULL); /* Name of event */dprintf(("%ld: PyThread_allocate_lock() -> %p\n", PyThread_get_thread_ident(), aLock));return (PyThread_type_lock) aLock;}void PyThread_free_lock(PyThread_type_lock aLock){dprintf(("%ld: PyThread_free_lock(%p) called\n", PyThread_get_thread_ident(),aLock));CloseHandle(aLock);}/** Return 1 on success if the lock was acquired** and 0 if the lock was not acquired. This means a 0 is returned* if the lock has already been acquired by this thread!*/int PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag){int success = 1;DWORD waitResult;dprintf(("%ld: PyThread_acquire_lock(%p, %d) called\n", PyThread_get_thread_ident(),aLock, waitflag));#ifndef DEBUGwaitResult = WaitForSingleObject(aLock, (waitflag ? INFINITE : 0));#else/* To aid in debugging, we regularly wake up. This allows us tobreak into the debugger */while (TRUE) {waitResult = WaitForSingleObject(aLock, waitflag ? 3000 : 0);if (waitflag==0 || (waitflag && waitResult == WAIT_OBJECT_0))break;}#endifif (waitResult != WAIT_OBJECT_0) {success = 0; /* We failed */}dprintf(("%ld: PyThread_acquire_lock(%p, %d) -> %d\n", PyThread_get_thread_ident(),aLock, waitflag, success));return success;}void PyThread_release_lock(PyThread_type_lock aLock){dprintf(("%ld: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock));if (!SetEvent(aLock))dprintf(("%ld: Could not PyThread_release_lock(%p) error: %l\n", PyThread_get_thread_ident(), aLock, GetLastError()));}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。