Issue #17522: Add the PyGILState_Check() API.
This commit is contained in:
parent
d4296fc19c
commit
684cd0e643
|
@ -654,6 +654,18 @@ with sub-interpreters:
|
|||
made on the main thread. This is mainly a helper/diagnostic function.
|
||||
|
||||
|
||||
.. c:function:: int PyGILState_Check()
|
||||
|
||||
Return 1 if the current thread is holding the GIL and 0 otherwise.
|
||||
This function can be called from any thread at any time.
|
||||
Only if it has had its Python thread state initialized and currently is
|
||||
holding the GIL will it return 1.
|
||||
This is mainly a helper/diagnostic function. It can be useful
|
||||
for example in callback contexts or memory allocation functions when
|
||||
knowing that the GIL is locked can allow the caller to perform sensitive
|
||||
actions or otherwise behave differently.
|
||||
|
||||
|
||||
The following macros are normally used without a trailing semicolon; look for
|
||||
example usage in the Python source distribution.
|
||||
|
||||
|
|
|
@ -212,6 +212,11 @@ PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE);
|
|||
*/
|
||||
PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void);
|
||||
|
||||
/* Helper/diagnostic function - return 1 if the current thread
|
||||
* currently holds the GIL, 0 otherwise
|
||||
*/
|
||||
PyAPI_FUNC(int) PyGILState_Check(void);
|
||||
|
||||
#endif /* #ifdef WITH_THREAD */
|
||||
|
||||
/* The implementation of sys._current_frames() Returns a dict mapping
|
||||
|
|
|
@ -10,6 +10,8 @@ What's New in Python 3.4.0 Alpha 1?
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #17522: Add the PyGILState_Check() API.
|
||||
|
||||
- Issue #16475: Support object instancing, recursion and interned strings
|
||||
in marshal
|
||||
|
||||
|
|
|
@ -697,6 +697,15 @@ PyGILState_GetThisThreadState(void)
|
|||
return (PyThreadState *)PyThread_get_key_value(autoTLSkey);
|
||||
}
|
||||
|
||||
int
|
||||
PyGILState_Check(void)
|
||||
{
|
||||
/* can't use PyThreadState_Get() since it will assert that it has the GIL */
|
||||
PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
|
||||
&_PyThreadState_Current);
|
||||
return tstate && (tstate == PyGILState_GetThisThreadState());
|
||||
}
|
||||
|
||||
PyGILState_STATE
|
||||
PyGILState_Ensure(void)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue