fix unsafe multithreaded boolean read/write 75/28975/6
authorKimmo Hoikka <kimmo.hoikka@samsung.com>
Fri, 17 Oct 2014 17:00:34 +0000 (18:00 +0100)
committerKimmo Hoikka <kimmo.hoikka@samsung.com>
Tue, 4 Nov 2014 14:34:29 +0000 (06:34 -0800)
Change-Id: I60d6263ea9b0740fcce2a19e83a0398424cd0784

adaptors/common/vsync-monitor.h
adaptors/tizen/vsync-monitor-tizen.cpp
adaptors/ubuntu/vsync-monitor-ubuntu.cpp

index 601a584732c7e3b574323aa92f7930425ac8a355..f990d7b6efe19914d30e5b050de9af1f4e4d7a85 100644 (file)
@@ -89,8 +89,9 @@ private:
 
   int       mFileDescriptor;  ///< DRM dev node file descriptor
   drmVBlank mVBlankInfo;
-  bool      mUseHardwareVSync; ///< Whether to use hardware vsync
-  bool      mHardwareVSyncAvailable; ///< Whether hardware vsync is available
+  // NOTE cannot use booleans as these are used from multiple threads, must use variable with machine word size for atomic read/write
+  unsigned int mUseHardwareVSync; ///< Whether to use hardware vsync
+  unsigned int mHardwareVSyncAvailable; ///< Whether hardware vsync is available
 };
 
 } // namespace Adaptor
index ea38d94a8b731705082c76ba955b84208adf94eb..2f89812168674a2081f20a9558724f1aa34263b9 100644 (file)
@@ -39,6 +39,9 @@ namespace Adaptor
 
 namespace
 {
+// constants to keep code readability with unsigned int has to be used as boolean (due to multithreading)
+const unsigned int TRUE = 1u;
+const unsigned int FALSE = 0u;
 
 #if defined(DEBUG_ENABLED)
 Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_VSYNC_MONITOR");
@@ -59,7 +62,7 @@ void ScreenStatusChanged(keynode_t* node, void* data)
   //  - VCONFKEY_PM_STATE_LCDDIM : turn vsync off
   //  - VCONFKEY_PM_STATE_LCDOFF : turn vsync off
   //  - VCONFKEY_PM_STATE_SLEEP : turn vsync off
-  const bool screenOn( VCONFKEY_PM_STATE_NORMAL == status );
+  const unsigned int screenOn( VCONFKEY_PM_STATE_NORMAL == status );
 
   vsyncMonitor->SetHardwareVSyncAvailable( screenOn );
 
@@ -70,8 +73,8 @@ void ScreenStatusChanged(keynode_t* node, void* data)
 
 VSyncMonitor::VSyncMonitor()
 : mFileDescriptor( FD_NONE ),
-  mUseHardwareVSync( true ),
-  mHardwareVSyncAvailable( false )
+  mUseHardwareVSync( TRUE ),
+  mHardwareVSyncAvailable( FALSE )
 {
   vconf_notify_key_changed( VCONFKEY_PM_STATE, ScreenStatusChanged, this );
 }
index 4379025b956d462996b033bb4fd755bb2489739a..af8d4c93bde7be735a485a602e62c28e4b34e33b 100644 (file)
@@ -37,6 +37,9 @@ namespace Adaptor
 
 namespace
 {
+// constants to keep code readability with unsigned int has to be used as boolean (due to multithreading)
+const unsigned int TRUE = 1u;
+const unsigned int FALSE = 0u;
 
 const int FD_NONE( -1 );
 
@@ -44,8 +47,8 @@ const int FD_NONE( -1 );
 
 VSyncMonitor::VSyncMonitor()
 : mFileDescriptor( FD_NONE ),
-  mUseHardwareVSync( false ),
-  mHardwareVSyncAvailable( false )
+  mUseHardwareVSync( FALSE ),
+  mHardwareVSyncAvailable( FALSE )
 {
 }