Skip to content
Permalink
Browse files

Signal condition variables with the mutex held. Destroy condition var…

…iables

before their mutexes.
  • Loading branch information
Kristján Valur Jónsson
Kristján Valur Jónsson committed Jun 5, 2012
1 parent 902274e commit 187aa545165d8d5eac222ecce29c8a77e0282dd4
Showing with 14 additions and 10 deletions.
  1. +5 −4 Python/ceval_gil.h
  2. +9 −6 Python/thread_pthread.h
@@ -313,13 +313,14 @@ static void create_gil(void)

static void destroy_gil(void)
{
MUTEX_FINI(gil_mutex);
#ifdef FORCE_SWITCHING
MUTEX_FINI(switch_mutex);
#endif
/* some pthread-like implementations tie the mutex to the cond
* and must have the cond destroyed first.
*/
COND_FINI(gil_cond);
MUTEX_FINI(gil_mutex);
#ifdef FORCE_SWITCHING
COND_FINI(switch_cond);
MUTEX_FINI(switch_mutex);
#endif
_Py_atomic_store_explicit(&gil_locked, -1, _Py_memory_order_release);
_Py_ANNOTATE_RWLOCK_DESTROY(&gil_locked);
@@ -443,12 +443,15 @@ PyThread_free_lock(PyThread_type_lock lock)

dprintf(("PyThread_free_lock(%p) called\n", lock));

status = pthread_mutex_destroy( &thelock->mut );
CHECK_STATUS("pthread_mutex_destroy");

/* some pthread-like implementations tie the mutex to the cond
* and must have the cond destroyed first.
*/
status = pthread_cond_destroy( &thelock->lock_released );
CHECK_STATUS("pthread_cond_destroy");

status = pthread_mutex_destroy( &thelock->mut );
CHECK_STATUS("pthread_mutex_destroy");

free((void *)thelock);
}

@@ -531,12 +534,12 @@ PyThread_release_lock(PyThread_type_lock lock)

thelock->locked = 0;

status = pthread_mutex_unlock( &thelock->mut );
CHECK_STATUS("pthread_mutex_unlock[3]");

/* wake up someone (anyone, if any) waiting on the lock */
status = pthread_cond_signal( &thelock->lock_released );
CHECK_STATUS("pthread_cond_signal");

status = pthread_mutex_unlock( &thelock->mut );
CHECK_STATUS("pthread_mutex_unlock[3]");
}

#endif /* USE_SEMAPHORES */

0 comments on commit 187aa54

Please sign in to comment.
You can’t perform that action at this time.