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 <[email protected]> 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 <[email protected]> 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); _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
