Thread (13 messages) flat view 13 messages, 5 authors, 2016-06-15

Re: [msysGit] Re: [PATCH/RFC] mingw: implement PTHREAD_MUTEX_INITIALIZER

From: Erik Faye-Lund <hidden>
Date: 2016-06-15 22:52:19

On Wed, Oct 26, 2011 at 5:05 AM, Atsushi Nakagawa [off-list ref] wrote:
On Oct 25, 11:55 pm, Erik Faye-Lund [off-list ref] wrote:
quoted
[...]
+int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t
*attr)
+{
+       InitializeCriticalSection(&mutex->cs);
+       mutex->autoinit = 0;
+       return 0;
+}
+
+int pthread_mutex_lock(pthread_mutex_t *mutex)
+{
+       if (mutex->autoinit) {
+               if (InterlockedCompareExchange(&mutex->autoinit, -1, 1) !=
-1) {
I'm making the assumption that mutex->autoinit starts off as 1 before things
get multi-threaded..
I've only looked at what's in the patch so I could be missing vital
context..  Anyways, is there a reason why you made this
"InterlockedCompareExchange(..., -1, 1) != -1" and not
"InterlockedCompareExchange(..., -1, 1) == 1"?
No, not really.
It looks to me the former adds a race condition after "if (mutex->autoinit)
{".  e.g. A second thread could reinitialize mutex->cs after the first
thread has already entered EnterCriticalSection(...).
You are indeed correct, thanks for spotting :)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help