Lines Matching defs:gil

93 static void _gil_initialize(struct _gil_runtime_state *gil)
96 gil->locked = uninitialized;
97 gil->interval = DEFAULT_INTERVAL;
100 static int gil_created(struct _gil_runtime_state *gil)
102 return (_Py_atomic_load_explicit(&gil->locked, _Py_memory_order_acquire) >= 0);
105 static void create_gil(struct _gil_runtime_state *gil)
107 MUTEX_INIT(gil->mutex);
109 MUTEX_INIT(gil->switch_mutex);
111 COND_INIT(gil->cond);
113 COND_INIT(gil->switch_cond);
115 _Py_atomic_store_relaxed(&gil->last_holder, 0);
116 _Py_ANNOTATE_RWLOCK_CREATE(&gil->locked);
117 _Py_atomic_store_explicit(&gil->locked, 0, _Py_memory_order_release);
120 static void destroy_gil(struct _gil_runtime_state *gil)
125 COND_FINI(gil->cond);
126 MUTEX_FINI(gil->mutex);
128 COND_FINI(gil->switch_cond);
129 MUTEX_FINI(gil->switch_mutex);
131 _Py_atomic_store_explicit(&gil->locked, -1,
133 _Py_ANNOTATE_RWLOCK_DESTROY(&gil->locked);
137 static void recreate_gil(struct _gil_runtime_state *gil)
139 _Py_ANNOTATE_RWLOCK_DESTROY(&gil->locked);
141 create_gil(gil);
149 struct _gil_runtime_state *gil = &ceval->gil;
150 if (!_Py_atomic_load_relaxed(&gil->locked)) {
159 _Py_atomic_store_relaxed(&gil->last_holder, (uintptr_t)tstate);
162 MUTEX_LOCK(gil->mutex);
163 _Py_ANNOTATE_RWLOCK_RELEASED(&gil->locked, /*is_write=*/1);
164 _Py_atomic_store_relaxed(&gil->locked, 0);
165 COND_SIGNAL(gil->cond);
166 MUTEX_UNLOCK(gil->mutex);
170 MUTEX_LOCK(gil->switch_mutex);
172 if (((PyThreadState*)_Py_atomic_load_relaxed(&gil->last_holder)) == tstate)
180 COND_WAIT(gil->switch_cond, gil->switch_mutex);
182 MUTEX_UNLOCK(gil->switch_mutex);
233 struct _gil_runtime_state *gil = &ceval->gil;
236 assert(gil_created(gil));
238 MUTEX_LOCK(gil->mutex);
240 if (!_Py_atomic_load_relaxed(&gil->locked)) {
245 while (_Py_atomic_load_relaxed(&gil->locked)) {
246 unsigned long saved_switchnum = gil->switch_number;
248 unsigned long interval = (gil->interval >= 1 ? gil->interval : 1);
250 COND_TIMED_WAIT(gil->cond, gil->mutex, interval, timed_out);
255 _Py_atomic_load_relaxed(&gil->locked) &&
256 gil->switch_number == saved_switchnum)
259 MUTEX_UNLOCK(gil->mutex);
280 /* This mutex must be taken before modifying gil->last_holder:
282 MUTEX_LOCK(gil->switch_mutex);
285 _Py_atomic_store_relaxed(&gil->locked, 1);
286 _Py_ANNOTATE_RWLOCK_ACQUIRED(&gil->locked, /*is_write=*/1);
288 if (tstate != (PyThreadState*)_Py_atomic_load_relaxed(&gil->last_holder)) {
289 _Py_atomic_store_relaxed(&gil->last_holder, (uintptr_t)tstate);
290 ++gil->switch_number;
294 COND_SIGNAL(gil->switch_cond);
295 MUTEX_UNLOCK(gil->switch_mutex);
306 MUTEX_UNLOCK(gil->mutex);
329 MUTEX_UNLOCK(gil->mutex);
336 struct _gil_runtime_state *gil = &_PyRuntime.ceval.gil;
337 gil->interval = microseconds;
342 struct _gil_runtime_state *gil = &_PyRuntime.ceval.gil;
343 return gil->interval;