| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | #ifndef Py_INTERNAL_GIL_H
 | 
					
						
							|  |  |  | #define Py_INTERNAL_GIL_H
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 23:02:26 +02:00
										 |  |  | #ifndef Py_BUILD_CORE
 | 
					
						
							|  |  |  | #  error "this header requires Py_BUILD_CORE define"
 | 
					
						
							| 
									
										
										
										
											2018-11-09 13:03:37 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-02 23:51:20 +02:00
										 |  |  | #include "pycore_atomic.h"    /* _Py_atomic_address */
 | 
					
						
							|  |  |  | #include "pycore_condvar.h"   /* PyCOND_T */
 | 
					
						
							| 
									
										
										
										
											2018-10-30 15:14:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | #ifndef Py_HAVE_CONDVAR
 | 
					
						
							| 
									
										
										
										
											2018-10-30 15:14:25 +01:00
										 |  |  | #  error You need either a POSIX-compatible or a Windows system!
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Enable if you want to force the switching of threads at least
 | 
					
						
							|  |  |  |    every `interval`. */ | 
					
						
							|  |  |  | #undef FORCE_SWITCHING
 | 
					
						
							|  |  |  | #define FORCE_SWITCHING
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _gil_runtime_state { | 
					
						
							|  |  |  |     /* microseconds (the Python API uses seconds, though) */ | 
					
						
							|  |  |  |     unsigned long interval; | 
					
						
							|  |  |  |     /* Last PyThreadState holding / having held the GIL. This helps us
 | 
					
						
							|  |  |  |        know whether anyone else was scheduled after we dropped the GIL. */ | 
					
						
							|  |  |  |     _Py_atomic_address last_holder; | 
					
						
							|  |  |  |     /* Whether the GIL is already taken (-1 if uninitialized). This is
 | 
					
						
							|  |  |  |        atomic because it can be read without any lock taken in ceval.c. */ | 
					
						
							|  |  |  |     _Py_atomic_int locked; | 
					
						
							|  |  |  |     /* Number of GIL switches since the beginning. */ | 
					
						
							|  |  |  |     unsigned long switch_number; | 
					
						
							|  |  |  |     /* This condition variable allows one or several threads to wait
 | 
					
						
							|  |  |  |        until the GIL is released. In addition, the mutex also protects | 
					
						
							|  |  |  |        the above variables. */ | 
					
						
							|  |  |  |     PyCOND_T cond; | 
					
						
							|  |  |  |     PyMUTEX_T mutex; | 
					
						
							|  |  |  | #ifdef FORCE_SWITCHING
 | 
					
						
							|  |  |  |     /* This condition variable helps the GIL-releasing thread wait for
 | 
					
						
							|  |  |  |        a GIL-awaiting thread to be scheduled and take the GIL. */ | 
					
						
							|  |  |  |     PyCOND_T switch_cond; | 
					
						
							|  |  |  |     PyMUTEX_T switch_mutex; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif /* !Py_INTERNAL_GIL_H */
 |