QNativeWifiEnginePlugin: replace a volatile bool with an atomic int
authorMarc Mutz <marc.mutz@kdab.com>
Fri, 24 Aug 2012 07:47:55 +0000 (09:47 +0200)
committerQt by Nokia <qt-info@nokia.com>
Wed, 29 Aug 2012 12:15:58 +0000 (14:15 +0200)
Since there is non-atomic data that is protected by 'triedResolve',
the (outer) read from triedResolve needs to have acquire, and the
store needs to have release semantics. The release implied by the
mutex unlock is not good enough because it only synchronises-with
the locking of the same mutex, which not all threads execute.

Change-Id: I90b62c4c0213472ecf2b95a1674a1c6c79dc3786
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
src/plugins/bearer/nativewifi/main.cpp

index a1ecd22..e431e82 100644 (file)
@@ -56,14 +56,14 @@ QT_BEGIN_NAMESPACE
 
 static void resolveLibrary()
 {
-    static volatile bool triedResolve = false;
+    static QBasicAtomicInt triedResolve = Q_BASIC_ATOMIC_INITIALIZER(false);
 
-    if (!triedResolve) {
+    if (!triedResolve.loadAcquire()) {
 #ifndef QT_NO_THREAD
         QMutexLocker locker(QMutexPool::globalInstanceGet(&local_WlanOpenHandle));
 #endif
 
-        if (!triedResolve) {
+        if (!triedResolve.load()) {
             local_WlanOpenHandle = (WlanOpenHandleProto)
                 QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanOpenHandle");
             local_WlanRegisterNotification = (WlanRegisterNotificationProto)
@@ -85,7 +85,7 @@ static void resolveLibrary()
             local_WlanCloseHandle = (WlanCloseHandleProto)
                 QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanCloseHandle");
 
-            triedResolve = true;
+            triedResolve.storeRelease(true);
         }
     }
 }