[rtems commit] posix: Fix mutex auto initialization

Sebastian Huber sebh at rtems.org
Wed Oct 8 09:17:50 UTC 2014


Module:    rtems
Branch:    master
Commit:    dfdad6ab1d4a8f51acca0420de3188b5470f7f16
Changeset: http://git.rtems.org/rtems/commit/?id=dfdad6ab1d4a8f51acca0420de3188b5470f7f16

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Oct  8 10:09:14 2014 +0200

posix: Fix mutex auto initialization

Use the once lock to prevent race conditions during auto initialization.

---

 cpukit/posix/src/mutexget.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/cpukit/posix/src/mutexget.c b/cpukit/posix/src/mutexget.c
index f683137..41a5495 100644
--- a/cpukit/posix/src/mutexget.c
+++ b/cpukit/posix/src/mutexget.c
@@ -19,6 +19,7 @@
 #endif
 
 #include <rtems/posix/muteximpl.h>
+#include <rtems/score/apimutex.h>
 
 static bool _POSIX_Mutex_Check_id_and_auto_init(
   pthread_mutex_t   *mutex,
@@ -34,7 +35,15 @@ static bool _POSIX_Mutex_Check_id_and_auto_init(
   if ( *mutex == PTHREAD_MUTEX_INITIALIZER ) {
     int eno;
 
-    eno = pthread_mutex_init( mutex, NULL );
+    _Once_Lock();
+
+    if ( *mutex == PTHREAD_MUTEX_INITIALIZER ) {
+      eno = pthread_mutex_init( mutex, NULL );
+    } else {
+      eno = 0;
+    }
+
+    _Once_Unlock();
 
     if ( eno != 0 ) {
       *location = OBJECTS_ERROR;



More information about the vc mailing list