Issue #9828: Destroy the GIL in Py_Finalize(), so that it gets properly

re-created on a subsequent call to Py_Initialize().  The problem (a crash)
wouldn't appear in 3.1 or 2.7 where the GIL's structure is more trivial.
This commit is contained in:
Antoine Pitrou 2010-09-13 14:16:46 +00:00
parent bea8ae7948
commit 1df1536fb9
5 changed files with 39 additions and 4 deletions

View file

@ -312,6 +312,15 @@ PyEval_InitThreads(void)
pending_lock = PyThread_allocate_lock();
}
void
_PyEval_FiniThreads(void)
{
if (!gil_created())
return;
destroy_gil();
assert(!gil_created());
}
void
PyEval_AcquireLock(void)
{
@ -368,10 +377,6 @@ PyEval_ReInitThreads(void)
if (!gil_created())
return;
/*XXX Can't use PyThread_free_lock here because it does too
much error-checking. Doing this cleanly would require
adding a new function to each thread_*.h. Instead, just
create a new lock and waste a little bit of memory */
recreate_gil();
pending_lock = PyThread_allocate_lock();
take_gil(tstate);