vcl/inc/opengl/watchdog.hxx        |   46 +++++++++++++++++++------------------
 vcl/source/opengl/OpenGLHelper.cxx |   36 ++++++++--------------------
 2 files changed, 35 insertions(+), 47 deletions(-)

New commits:
commit 7dfe0da0d9852c1f5bb1b71257e914435f75a44b
Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
Date:   Tue Sep 20 18:36:46 2016 +0900

    tdf#102295: remove mutex - use atomic for watchdog timings
    
    Change-Id: I6587bad8b7906faeae39735343278b10be78c05b
    Reviewed-on: https://gerrit.libreoffice.org/29082
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Jan Holesovsky <ke...@collabora.com>

diff --git a/vcl/inc/opengl/watchdog.hxx b/vcl/inc/opengl/watchdog.hxx
index ced3cf2..c266de6 100644
--- a/vcl/inc/opengl/watchdog.hxx
+++ b/vcl/inc/opengl/watchdog.hxx
@@ -14,40 +14,42 @@
 #include <sal/types.h>
 #include <rtl/ref.hxx>
 #include <salhelper/thread.hxx>
-#include <osl/mutex.hxx>
+#include <atomic>
 
-struct WatchdogTimings
+struct WatchdogTimingsValues
 {
-    osl::Mutex maMutex;
-
-    int mnMode;
-
     /// delays to take various actions in 1/4 of a second increments.
-    std::vector<int> maDisableEntries;
-    std::vector<int> maAbortAfter;
+    int mnDisableEntries;
+    int mnAbortAfter;
+};
 
-    WatchdogTimings();
+enum class WatchdogTimingMode
+{
+    NORMAL,
+    SHADER_COMPILE
+};
 
-    void relax();
+class WatchdogTimings
+{
+private:
+    std::vector<WatchdogTimingsValues> maTimingValues;
+    std::atomic<bool> mbRelaxed;
 
-    int getMode()
-    {
-        return mnMode;
-    }
+public:
+    WatchdogTimings();
 
-    void setMode(int nMode)
+    void setRelax(bool bRelaxed)
     {
-        mnMode = nMode;
+        mbRelaxed = bRelaxed;
     }
 
-    int getDisableEntries()
+    WatchdogTimingsValues getWatchdogTimingsValues(WatchdogTimingMode eMode)
     {
-       return maDisableEntries[mnMode];
-    }
+        size_t index = 0;
+        index = (eMode == WatchdogTimingMode::SHADER_COMPILE) ? 1 : 0;
+        index = mbRelaxed ? index + 2 : index;
 
-    int getAbortAfter()
-    {
-        return maAbortAfter[mnMode];
+        return maTimingValues[index];
     }
 };
 
diff --git a/vcl/source/opengl/OpenGLHelper.cxx 
b/vcl/source/opengl/OpenGLHelper.cxx
index 6b58a4d..12f6151 100644
--- a/vcl/source/opengl/OpenGLHelper.cxx
+++ b/vcl/source/opengl/OpenGLHelper.cxx
@@ -818,20 +818,10 @@ namespace {
 }
 
 WatchdogTimings::WatchdogTimings()
-    : mnMode(0)
-    , maDisableEntries({ 6 /* 1.5s */,  20 /* 5s */ })
-    , maAbortAfter({ 20 /* 5s */, 120 /* 30s */ })
-{}
-
-void WatchdogTimings::relax()
+    : maTimingValues({{6,   20} /* 1.5s,  5s */, {20, 120} /*  5s, 30s */,
+                      {60, 240} /*  15s, 60s */, {60, 240} /* 15s, 60s */})
+    , mbRelaxed(false)
 {
-    osl::MutexGuard g(maMutex);
-
-    maDisableEntries[0] = 60; /* 15s */
-    maDisableEntries[1] = 60; /* 15s */
-
-    maAbortAfter[0] = 240; /* 60s */
-    maAbortAfter[1] = 240; /* 60s */
 }
 
 OpenGLWatchdogThread::OpenGLWatchdogThread()
@@ -852,13 +842,9 @@ void OpenGLWatchdogThread::execute()
 
         if (OpenGLZone::isInZone())
         {
-            osl::MutexGuard g(gWatchdogTimings.maMutex);
-
             // The shader compiler can take a long time, first time.
-            if (gbInShaderCompile)
-                gWatchdogTimings.setMode(1);
-            else
-                gWatchdogTimings.setMode(0);
+            WatchdogTimingMode eMode = gbInShaderCompile ? 
WatchdogTimingMode::SHADER_COMPILE : WatchdogTimingMode::NORMAL;
+            WatchdogTimingsValues aTimingValues = 
gWatchdogTimings.getWatchdogTimingsValues(eMode);
 
             if (nLastEnters == OpenGLZone::gnEnterCount)
                 nUnchanged++;
@@ -867,12 +853,12 @@ void OpenGLWatchdogThread::execute()
             SAL_INFO("vcl.opengl", "GL watchdog - unchanged " <<
                      nUnchanged << " enter count " <<
                      OpenGLZone::gnEnterCount << " type " <<
-                     (gWatchdogTimings.getMode() ? "in shader" : "normal gl") 
<<
-                     "breakpoints mid: " << 
gWatchdogTimings.getDisableEntries() <<
-                     " max " << gWatchdogTimings.getAbortAfter());
+                     (eMode == WatchdogTimingMode::SHADER_COMPILE ? "in 
shader" : "normal gl") <<
+                     "breakpoints mid: " << aTimingValues.mnDisableEntries <<
+                     " max " << aTimingValues.mnAbortAfter);
 
             // Not making progress
-            if (nUnchanged >= gWatchdogTimings.getDisableEntries())
+            if (nUnchanged >= aTimingValues.mnDisableEntries)
             {
                 static bool bFired = false;
                 if (!bFired)
@@ -893,7 +879,7 @@ void OpenGLWatchdogThread::execute()
             }
 
             // Not making even more progress
-            if (nUnchanged >= gWatchdogTimings.getAbortAfter())
+            if (nUnchanged >= aTimingValues.mnAbortAfter)
             {
                 if (!bAbortFired)
                 {
@@ -969,7 +955,7 @@ void OpenGLZone::hardDisable()
 
 void OpenGLZone::relaxWatchdogTimings()
 {
-    gWatchdogTimings.relax();
+    gWatchdogTimings.setRelax(true);
 }
 
 OpenGLVCLContextZone::OpenGLVCLContextZone()
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to