Author: Armin Rigo <[email protected]>
Branch:
Changeset: r97442:6cd7a0d1a940
Date: 2019-09-11 17:05 +0200
http://bitbucket.org/pypy/pypy/changeset/6cd7a0d1a940/
Log: CPython issue #38106
On OS X, call pthread_cond_signal() before pthread_mutex_unlock().
This should not make a difference, but does if another thread
notices that the lock is released and frees the lock---this is
possible at any time after the pthread_mutex_unlock(). We can't rely
on the condition variable 'lock->lock_released' to remain in
existence.
This can't occur on top of Python lock objects because of the GC,
but can occur by direct calls to the C API functions via cpyext.
diff --git a/rpython/translator/c/src/thread_pthread.c
b/rpython/translator/c/src/thread_pthread.c
--- a/rpython/translator/c/src/thread_pthread.c
+++ b/rpython/translator/c/src/thread_pthread.c
@@ -454,13 +454,13 @@
lock->locked = 0;
- status = pthread_mutex_unlock( &lock->mut );
- CHECK_STATUS("pthread_mutex_unlock[3]");
-
/* wake up someone (anyone, if any) waiting on the lock */
status = pthread_cond_signal( &lock->lock_released );
CHECK_STATUS("pthread_cond_signal");
+ status = pthread_mutex_unlock( &lock->mut );
+ CHECK_STATUS("pthread_mutex_unlock[3]");
+
return result;
}
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit