summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToma┼ż Vajngerl <tomaz.vajngerl@collabora.co.uk>2016-09-20 18:36:46 +0900
committerJan Holesovsky <kendy@collabora.com>2016-09-20 16:42:44 +0000
commit7dfe0da0d9852c1f5bb1b71257e914435f75a44b (patch)
tree0928134618f71f716186ef4fb3459fc024612c5a
parent1e40b728c647b0539f4c60c84fada638285a9bd5 (diff)
tdf#102295: remove mutex - use atomic for watchdog timings
Change-Id: I6587bad8b7906faeae39735343278b10be78c05b Reviewed-on: https://gerrit.libreoffice.org/29082 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Jan Holesovsky <kendy@collabora.com>
-rw-r--r--vcl/inc/opengl/watchdog.hxx46
-rw-r--r--vcl/source/opengl/OpenGLHelper.cxx36
2 files changed, 35 insertions, 47 deletions
diff --git a/vcl/inc/opengl/watchdog.hxx b/vcl/inc/opengl/watchdog.hxx
index ced3cf23fbd6..c266de62f7dc 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 6b58a4d0c83d..12f6151048f7 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()