Issue #17522: Add the PyGILState_Check() API.

This commit is contained in:
Kristján Valur Jónsson 2013-03-23 03:36:16 -07:00
parent d4296fc19c
commit 684cd0e643
4 changed files with 28 additions and 0 deletions

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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)
{