• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef Py_INTERNAL_GIL_H
2 #define Py_INTERNAL_GIL_H
3 #ifdef __cplusplus
4 extern "C" {
5 #endif
6 
7 #ifndef Py_BUILD_CORE
8 #  error "this header requires Py_BUILD_CORE define"
9 #endif
10 
11 #include "pycore_atomic.h"    /* _Py_atomic_address */
12 #include "pycore_condvar.h"   /* PyCOND_T */
13 
14 #ifndef Py_HAVE_CONDVAR
15 #  error You need either a POSIX-compatible or a Windows system!
16 #endif
17 
18 /* Enable if you want to force the switching of threads at least
19    every `interval`. */
20 #undef FORCE_SWITCHING
21 #define FORCE_SWITCHING
22 
23 struct _gil_runtime_state {
24     /* microseconds (the Python API uses seconds, though) */
25     unsigned long interval;
26     /* Last PyThreadState holding / having held the GIL. This helps us
27        know whether anyone else was scheduled after we dropped the GIL. */
28     _Py_atomic_address last_holder;
29     /* Whether the GIL is already taken (-1 if uninitialized). This is
30        atomic because it can be read without any lock taken in ceval.c. */
31     _Py_atomic_int locked;
32     /* Number of GIL switches since the beginning. */
33     unsigned long switch_number;
34     /* This condition variable allows one or several threads to wait
35        until the GIL is released. In addition, the mutex also protects
36        the above variables. */
37     PyCOND_T cond;
38     PyMUTEX_T mutex;
39 #ifdef FORCE_SWITCHING
40     /* This condition variable helps the GIL-releasing thread wait for
41        a GIL-awaiting thread to be scheduled and take the GIL. */
42     PyCOND_T switch_cond;
43     PyMUTEX_T switch_mutex;
44 #endif
45 };
46 
47 #ifdef __cplusplus
48 }
49 #endif
50 #endif /* !Py_INTERNAL_GIL_H */
51