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

Re: [PATCH/RFC] mingw: implement PTHREAD_MUTEX_INITIALIZER

From: Atsushi Nakagawa <hidden>
Date: 2016-06-15 22:52:19

On Oct 25, 11:55 pm, Erik Faye-Lund [off-list ref] wrote:
[...]
+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"?

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(...).
+                       pthread_mutex_init(mutex, NULL);
+                       mutex->autoinit = 0;
+               } else
+                       while (mutex->autoinit != 0)
+                               ; /* wait for other thread */
+       }
+
+       EnterCriticalSection(&mutex->cs);
+       return 0;
+}
[...]
-- 
Atsushi Nakagawa
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help