New GitHub issue #96071 from tom-pytel:<br>
<hr>
<pre>
# Bug report
This used to work with py 3.8, 3.9 and 3.10 but now fails. The failure is due to a deadlock condition due to the move of an alloc from before a HEAD_LOCK() to after causing a recursive call to PyGILState_Ensure() which eventually deadlocks on the HEAD_LOCK().
The following is a trace of calls from the initial call to PyGILState_Ensure() to the eventual deadlock:
```
pystate:PyGILState_Ensure()
pystate:PyThreadState_New()
pystate:new_threadstate()
HEAD_LOCK() <-- Initial head locked, the alloc_threadstate() call below used to happen before this in previous versions of Python.
pystate:alloc_threadstate()
obmalloc:PyMem_RawCalloc()
_tracemalloc:_PyMem_Raw.calloc()
_tracemalloc:tracemalloc_raw_alloc()
get_reentrant() = 0
set_reenterant(1)
pystate:PyGILState_Ensure()
pystate:PyThreadState_New()
pystate:new_threadstate()
HEAD_LOCK() <-- DEADLOCK HERE!
```
Steps to reproduce: In a Python C extension module, create a C thread then try to call PyGILState_Ensure().
# Your environment
Python 3.11.0rc1
Linux tom-VirtualBox 5.15.0-46-generic #49~20.04.1-Ubuntu SMP Thu Aug 4 19:15:44 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
</pre>
<hr>
<a href="https://github.com/python/cpython/issues/96071">View on GitHub</a>
<p>Labels: type-bug</p>
<p>Assignee: </p>