| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* 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. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2001-10-16 21:13:49 +00:00
										 |  |  | long PyThread_start_new_thread(void (*func)(void *), void *arg) | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     long rv; | 
					
						
							|  |  |  |     int success = -1; | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     dprintf(("%ld: PyThread_start_new_thread called\n", PyThread_get_thread_ident())); | 
					
						
							|  |  |  |     if (!initialized) | 
					
						
							|  |  |  |         PyThread_init_thread(); | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     rv = _beginthread(func, 0, arg); /* use default stack size */ | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (rv != -1) { | 
					
						
							|  |  |  |         success = 0; | 
					
						
							|  |  |  |         dprintf(("%ld: PyThread_start_new_thread succeeded:\n", PyThread_get_thread_ident())); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return success; | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * 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) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (!initialized) | 
					
						
							|  |  |  |         PyThread_init_thread(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return GetCurrentThreadId(); | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void PyThread_exit_thread(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     dprintf(("%ld: PyThread_exit_thread called\n", PyThread_get_thread_ident())); | 
					
						
							|  |  |  |     if (!initialized) | 
					
						
							|  |  |  |         exit(0); | 
					
						
							|  |  |  |     _endthread(); | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * 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) | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyThread_init_thread(); | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     aLock = CreateEvent(NULL,           /* Security attributes      */ | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             0,              /* Manual-Reset               */ | 
					
						
							|  |  |  |                         1,              /* Is initially signalled  */ | 
					
						
							|  |  |  |             NULL);          /* Name of event            */ | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-30 15:01:00 +00:00
										 |  |  |     dprintf(("%ld: PyThread_allocate_lock() -> %p\n", PyThread_get_thread_ident(), aLock)); | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return (PyThread_type_lock) aLock; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void PyThread_free_lock(PyThread_type_lock aLock) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2000-06-30 15:01:00 +00:00
										 |  |  |     dprintf(("%ld: PyThread_free_lock(%p) called\n", PyThread_get_thread_ident(),aLock)); | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-30 15:01:00 +00:00
										 |  |  |     dprintf(("%ld: PyThread_acquire_lock(%p, %d) called\n", PyThread_get_thread_ident(),aLock, waitflag)); | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifndef DEBUG
 | 
					
						
							| 
									
										
										
										
											2005-07-09 15:26:33 +00:00
										 |  |  |     waitResult = WaitForSingleObject(aLock, (waitflag ? INFINITE : 0)); | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     /* To aid in debugging, we regularly wake up.  This allows us to
 | 
					
						
							|  |  |  |     break into the debugger */ | 
					
						
							|  |  |  |     while (TRUE) { | 
					
						
							|  |  |  |         waitResult = WaitForSingleObject(aLock, waitflag ? 3000 : 0); | 
					
						
							|  |  |  |         if (waitflag==0 || (waitflag && waitResult == WAIT_OBJECT_0)) | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (waitResult != WAIT_OBJECT_0) { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |                 success = 0;    /* We failed */ | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     dprintf(("%ld: PyThread_acquire_lock(%p, %d) -> %d\n", PyThread_get_thread_ident(),aLock, waitflag, success)); | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     return success; | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void PyThread_release_lock(PyThread_type_lock aLock) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2000-06-30 15:01:00 +00:00
										 |  |  |     dprintf(("%ld: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock)); | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!SetEvent(aLock)) | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     dprintf(("%ld: Could not PyThread_release_lock(%p) error: %l\n", PyThread_get_thread_ident(), aLock, GetLastError())); | 
					
						
							| 
									
										
										
										
											1999-04-08 13:57:06 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |