[Libreoffice-commits] core.git: 2 commits - chart2/source

Michael Meeks michael.meeks at collabora.com
Wed Sep 10 09:07:26 PDT 2014


 chart2/source/view/charttypes/GL3DBarChart.cxx |   79 ++++++++++++-------------
 chart2/source/view/inc/GL3DBarChart.hxx        |    2 
 2 files changed, 41 insertions(+), 40 deletions(-)

New commits:
commit 778dd8f6f1b272c01e848235613d839b9c42b07b
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Wed Sep 10 16:42:39 2014 +0100

    fdo#83716 - fix deadlock holding mutex required by rendering thread.
    
    Change-Id: I7195bba02474ac1c00fce0a93f59be622a920686

diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx
index cc8ab34..6245b5f 100644
--- a/chart2/source/view/charttypes/GL3DBarChart.cxx
+++ b/chart2/source/view/charttypes/GL3DBarChart.cxx
@@ -932,7 +932,6 @@ void GL3DBarChart::clickedAt(const Point& rPos, sal_uInt16 nButtons)
 
     maStepDirection = (maTargetDirection - maCameraDirection)/((float)mnStepsTotal);
     */
-
 }
 
 void GL3DBarChart::render()
@@ -947,20 +946,27 @@ void GL3DBarChart::mouseDragMove(const Point& rStartPos, const Point& rEndPos, s
 {
     long nDirection = rEndPos.X() - rStartPos.X();
     SharedResourceAccess(maCond1, maCond2);
-    osl::MutexGuard aGuard(maMutex);
+    osl::ClearableGuard<osl::Mutex> aGuard(maMutex);
     if ((maRenderEvent == EVENT_NONE) || (maRenderEvent == EVENT_SHOW_SCROLL) ||
         (maRenderEvent == EVENT_AUTO_FLY) || (maRenderEvent == EVENT_SHOW_SELECT))
         maRenderEvent = nDirection > 0 ? EVENT_DRAG_RIGHT : EVENT_DRAG_LEFT;
+    bool bMove = false;
     if(nDirection < 0)
     {
         mnCornerId = (mnCornerId + 1) % 4;
-        moveToCorner();
+        bMove = true;
     }
     else if(nDirection > 0)
     {
         mnCornerId = mnCornerId - 1;
         if(mnCornerId < 0)
             mnCornerId = 3;
+        bMove = true;
+    }
+
+    if (bMove)
+    {
+        aGuard.clear();
         moveToCorner();
     }
 }
commit d7d05136003d1d3adf74285ea1d52a60caaaf763
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Wed Sep 10 16:32:05 2014 +0100

    Re-factor ~inexcusible copy/paste coding away.
    
    Change-Id: I2ad27cb09031dfadaa628939c191ccc5d88ecffe

diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx
index cd03a38..cc8ab34 100644
--- a/chart2/source/view/charttypes/GL3DBarChart.cxx
+++ b/chart2/source/view/charttypes/GL3DBarChart.cxx
@@ -546,8 +546,7 @@ GL3DBarChart::~GL3DBarChart()
         mbRenderDie = true;
     }
 
-    if(mpRenderThread.is())
-        mpRenderThread->join();
+    joinRenderThread();
 
     if(mbValidContext && mpWindow)
         mpWindow->setRenderer(NULL);
@@ -776,30 +775,43 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer
             mpRenderer->SetScrollSpeed((float)(BAR_SIZE_X + BAR_DISTANCE_X) / (float)miScrollRate);
             mpRenderer->SetScrollDistance((float)(BAR_SIZE_X + BAR_DISTANCE_X));
         }
-        Size aSize = mpWindow->GetSizePixel();
-        mpWindow->getContext().setWinSize(aSize);
-        mpRenderThread = rtl::Reference<RenderThread>(new RenderBenchMarkThread(this));
-        mpWindow->getContext().resetCurrent();
-        mpRenderThread->launch();
+        spawnRenderThread(new RenderBenchMarkThread(this));
     }
     miDataUpdateCounter++;
     maHistoryCounter++;
     mbNeedsNewRender = true;
 }
 
-void GL3DBarChart::update()
+void GL3DBarChart::joinRenderThread()
 {
-    if (mbBenchMarkMode)
-        return;
     if(mpRenderThread.is())
+    {
+        // FIXME: badly want to assert that we don't
+        // hold the mutex here ... but can't API-wise.
         mpRenderThread->join();
+    }
+}
+
+void GL3DBarChart::spawnRenderThread(RenderThread *pThread)
+{
+    joinRenderThread(); // not holding maMutex
+
+    osl::MutexGuard aGuard(maMutex);
+
     Size aSize = mpWindow->GetSizePixel();
     mpWindow->getContext().setWinSize(aSize);
-    mpRenderThread = rtl::Reference<RenderThread>(new RenderOneFrameThread(this));
+    mpRenderThread = rtl::Reference<RenderThread>(pThread);
     mpWindow->getContext().resetCurrent();
     mpRenderThread->launch();
 }
 
+void GL3DBarChart::update()
+{
+    if (mbBenchMarkMode)
+        return;
+    spawnRenderThread(new RenderOneFrameThread(this));
+}
+
 namespace {
 
 class PickingModeSetter
@@ -839,15 +851,7 @@ void GL3DBarChart::moveToDefault()
         return;
     }
 
-    if(mpRenderThread.is())
-        mpRenderThread->join();
-
-    osl::MutexGuard aGuard(maMutex);
-    Size aSize = mpWindow->GetSizePixel();
-    mpWindow->getContext().setWinSize(aSize);
-    mpRenderThread = rtl::Reference<RenderThread>(new RenderAnimationThread(this, maCameraPosition, maDefaultCameraPosition, STEPS));
-    mpWindow->getContext().resetCurrent();
-    mpRenderThread->launch();
+    spawnRenderThread(new RenderAnimationThread(this, maCameraPosition, maDefaultCameraPosition, STEPS));
 
     /*
      * TODO: moggi: add to thread
@@ -891,7 +895,7 @@ void GL3DBarChart::clickedAt(const Point& rPos, sal_uInt16 nButtons)
     {
         PickingModeSetter aPickingModeSetter(mpRenderer.get());
         update();
-        mpRenderThread->join();
+        joinRenderThread();
         nId = mpRenderer->GetPixelColorFromPoint(rPos.X(), rPos.Y());
     }
     // we need this update here to render one frame without picking mode being set
@@ -916,11 +920,9 @@ void GL3DBarChart::clickedAt(const Point& rPos, sal_uInt16 nButtons)
     glm::vec3 aTargetPosition = rBarInfo.maPos;
     aTargetPosition.z += 240;
     aTargetPosition.y += BAR_SIZE_Y / 2.0f;
-    Size aSize = mpWindow->GetSizePixel();
-    mpWindow->getContext().setWinSize(aSize);
-    mpRenderThread = rtl::Reference<RenderThread>(new RenderAnimationThread(this, maCameraPosition, aTargetPosition, STEPS));
-    mpWindow->getContext().resetCurrent();
-    mpRenderThread->launch();
+
+    spawnRenderThread(new RenderAnimationThread(this, maCameraPosition,
+                                                aTargetPosition, STEPS));
 
     /*
      * TODO: moggi: add to thread
@@ -1002,17 +1004,8 @@ void GL3DBarChart::moveToCorner()
         return;
     }
 
-    if(mpRenderThread.is())
-        mpRenderThread->join();
-
-    osl::MutexGuard aGuard(maMutex);
-
-    Size aSize = mpWindow->GetSizePixel();
-    mpWindow->getContext().setWinSize(aSize);
-    mpRenderThread = rtl::Reference<RenderThread>(new RenderAnimationThread(this, maCameraPosition,
-                getCornerPosition(mnCornerId), STEPS));
-    mpWindow->getContext().resetCurrent();
-    mpRenderThread->launch();
+    spawnRenderThread(new RenderAnimationThread(this, maCameraPosition,
+                                                getCornerPosition(mnCornerId), STEPS));
 
     // TODO: moggi: add to thread
     // maStepDirection = (glm::vec3(mnMaxX/2.0f, mnMaxY/2.0f, 0) - maCameraDirection)/ float(mnStepsTotal);
diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx
index 11d7eeb..6da88c1 100644
--- a/chart2/source/view/inc/GL3DBarChart.hxx
+++ b/chart2/source/view/inc/GL3DBarChart.hxx
@@ -85,6 +85,8 @@ public:
 
 private:
 
+    void spawnRenderThread(RenderThread *pThread);
+    void joinRenderThread();
     void moveToCorner();
     void moveToDefault();
     glm::vec3 getCornerPosition(sal_Int8 nCornerId);


More information about the Libreoffice-commits mailing list