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