17db96d56Sopenharmony_ci#ifndef Py_INTERNAL_GIL_H 27db96d56Sopenharmony_ci#define Py_INTERNAL_GIL_H 37db96d56Sopenharmony_ci#ifdef __cplusplus 47db96d56Sopenharmony_ciextern "C" { 57db96d56Sopenharmony_ci#endif 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE 87db96d56Sopenharmony_ci# error "this header requires Py_BUILD_CORE define" 97db96d56Sopenharmony_ci#endif 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci#include "pycore_atomic.h" /* _Py_atomic_address */ 127db96d56Sopenharmony_ci#include "pycore_condvar.h" /* PyCOND_T */ 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ci#ifndef Py_HAVE_CONDVAR 157db96d56Sopenharmony_ci# error You need either a POSIX-compatible or a Windows system! 167db96d56Sopenharmony_ci#endif 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci/* Enable if you want to force the switching of threads at least 197db96d56Sopenharmony_ci every `interval`. */ 207db96d56Sopenharmony_ci#undef FORCE_SWITCHING 217db96d56Sopenharmony_ci#define FORCE_SWITCHING 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_cistruct _gil_runtime_state { 247db96d56Sopenharmony_ci /* microseconds (the Python API uses seconds, though) */ 257db96d56Sopenharmony_ci unsigned long interval; 267db96d56Sopenharmony_ci /* Last PyThreadState holding / having held the GIL. This helps us 277db96d56Sopenharmony_ci know whether anyone else was scheduled after we dropped the GIL. */ 287db96d56Sopenharmony_ci _Py_atomic_address last_holder; 297db96d56Sopenharmony_ci /* Whether the GIL is already taken (-1 if uninitialized). This is 307db96d56Sopenharmony_ci atomic because it can be read without any lock taken in ceval.c. */ 317db96d56Sopenharmony_ci _Py_atomic_int locked; 327db96d56Sopenharmony_ci /* Number of GIL switches since the beginning. */ 337db96d56Sopenharmony_ci unsigned long switch_number; 347db96d56Sopenharmony_ci /* This condition variable allows one or several threads to wait 357db96d56Sopenharmony_ci until the GIL is released. In addition, the mutex also protects 367db96d56Sopenharmony_ci the above variables. */ 377db96d56Sopenharmony_ci PyCOND_T cond; 387db96d56Sopenharmony_ci PyMUTEX_T mutex; 397db96d56Sopenharmony_ci#ifdef FORCE_SWITCHING 407db96d56Sopenharmony_ci /* This condition variable helps the GIL-releasing thread wait for 417db96d56Sopenharmony_ci a GIL-awaiting thread to be scheduled and take the GIL. */ 427db96d56Sopenharmony_ci PyCOND_T switch_cond; 437db96d56Sopenharmony_ci PyMUTEX_T switch_mutex; 447db96d56Sopenharmony_ci#endif 457db96d56Sopenharmony_ci}; 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ci#ifdef __cplusplus 487db96d56Sopenharmony_ci} 497db96d56Sopenharmony_ci#endif 507db96d56Sopenharmony_ci#endif /* !Py_INTERNAL_GIL_H */ 51