]> granicus.if.org Git - python/commitdiff
Signal condition variables with the mutex held. Destroy condition variables
authorKristján Valur Jónsson <kristjan@ccpgames.com>
Tue, 5 Jun 2012 22:17:42 +0000 (22:17 +0000)
committerKristján Valur Jónsson <kristjan@ccpgames.com>
Tue, 5 Jun 2012 22:17:42 +0000 (22:17 +0000)
before their mutexes.

Python/ceval_gil.h
Python/thread_pthread.h

index bf7a350791f931dd0d1c2df2726e2b852aeaf681..e7764f293a74782ac0a943778c19cba711e0a7f7 100644 (file)
@@ -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);
index 4f9e2c19d6b10a1944679fd8ea11fb82353b9cae..5007aaf0b717a98c2c77f6d0a8aeec685eab08a4 100644 (file)
@@ -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 */