[Libreoffice-commits] .: Branch 'libreoffice-4-0' - sd/source slideshow/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Mon Jan 28 08:31:47 PST 2013


 sd/source/ui/remotecontrol/Communicator.cxx  |    2 -
 sd/source/ui/remotecontrol/ImagePreparer.cxx |   33 ++++++++++-----------------
 sd/source/ui/remotecontrol/ImagePreparer.hxx |   10 +++-----
 sd/source/ui/remotecontrol/Listener.cxx      |    9 ++++---
 sd/source/ui/remotecontrol/Receiver.cxx      |   24 ++++++++++++++++++-
 sd/source/ui/remotecontrol/Receiver.hxx      |   10 ++++++--
 slideshow/source/engine/slideshowimpl.cxx    |    6 ++++
 7 files changed, 60 insertions(+), 34 deletions(-)

New commits:
commit f07efaa3bbeb6c2160d6ccbe83ea4183df7115a3
Author: Michael Meeks <michael.meeks at suse.com>
Date:   Mon Jan 28 20:03:20 2013 +1100

    fdo#59881 - sdremote: give up on threaded / UNO usage.
    
    Process incoming commands in the main thread in a Timeout, build
    thumbnail / previews there too - to avoid the deadlocks mentioned
    in the bug.
    
    (cherry picked from commit 58b05ce98e72fe47bdca02d2dabea20c36a494bf)
    
    Change-Id: I5f5e8d6fbc2e059d4194f72f3e086e1aa87ab2cc
    Signed-off-by: Thorsten Behrens <tbehrens at suse.com>

diff --git a/sd/source/ui/remotecontrol/Communicator.cxx b/sd/source/ui/remotecontrol/Communicator.cxx
index f567b10..3e3e7bc 100644
--- a/sd/source/ui/remotecontrol/Communicator.cxx
+++ b/sd/source/ui/remotecontrol/Communicator.cxx
@@ -81,7 +81,7 @@ void Communicator::execute()
         }
         else
         {
-            aReceiver.parseCommand( aCommand );
+            aReceiver.pushCommand( aCommand );
             aCommand.clear();
         }
     }
diff --git a/sd/source/ui/remotecontrol/ImagePreparer.cxx b/sd/source/ui/remotecontrol/ImagePreparer.cxx
index 66b2791..abb43e4 100644
--- a/sd/source/ui/remotecontrol/ImagePreparer.cxx
+++ b/sd/source/ui/remotecontrol/ImagePreparer.cxx
@@ -50,36 +50,29 @@ ImagePreparer::ImagePreparer(
  :  xController( rxController ),
     pTransmitter( aTransmitter )
 {
+    SetTimeout( 50 );
+    mnSendingSlide = 0;
+    Start();
 }
 
 ImagePreparer::~ImagePreparer()
 {
+    Stop();
 }
 
-void SAL_CALL ImagePreparer::run()
+void SAL_CALL ImagePreparer::Timeout()
 {
     sal_uInt32 aSlides = xController->getSlideCount();
-    for ( sal_uInt32 i = 0; i < aSlides; i++ )
+    if ( xController->isRunning() && // not stopped/disposed of.
+         mnSendingSlide < aSlides )
     {
-        if ( !xController->isRunning() ) // stopped/disposed of.
-        {
-            break;
-        }
-        sendPreview( i );
-    }
-    for ( sal_uInt32 i = 0; i < aSlides; i++ )
-    {
-        if ( !xController->isRunning() ) // stopped/disposed of.
-        {
-            break;
-        }
-        sendNotes( i );
+        sendPreview( mnSendingSlide );
+        sendNotes( mnSendingSlide );
+        mnSendingSlide++;
+        Start();
     }
-}
-
-void SAL_CALL ImagePreparer::onTerminated()
-{
-    delete this;
+    else
+        Stop();
 }
 
 void ImagePreparer::sendPreview( sal_uInt32 aSlideNumber )
diff --git a/sd/source/ui/remotecontrol/ImagePreparer.hxx b/sd/source/ui/remotecontrol/ImagePreparer.hxx
index aa013d7..66b30ae 100644
--- a/sd/source/ui/remotecontrol/ImagePreparer.hxx
+++ b/sd/source/ui/remotecontrol/ImagePreparer.hxx
@@ -10,7 +10,7 @@
 #define _SD_IMPRESSREMOTE_IMAGEPREPARER_HXX
 
 #include <osl/thread.hxx>
-
+#include <vcl/timer.hxx>
 #include <com/sun/star/presentation/XSlideShowController.hpp>
 
 #include "Transmitter.hxx"
@@ -18,9 +18,9 @@
 namespace sd
 {
 
-class ImagePreparer:
-    public osl::Thread
+class ImagePreparer : Timer
 {
+    sal_uInt32 mnSendingSlide;
 public:
     ImagePreparer( const
         css::uno::Reference<css::presentation::XSlideShowController>&
@@ -31,9 +31,7 @@ private:
     css::uno::Reference<css::presentation::XSlideShowController> xController;
     Transmitter *pTransmitter;
 
-    // Thread method
-    virtual void SAL_CALL run();
-    virtual void SAL_CALL onTerminated();
+    virtual void Timeout();
 
     void sendPreview( sal_uInt32 aSlideNumber );
     css::uno::Sequence<sal_Int8> preparePreview( sal_uInt32 aSlideNumber,
diff --git a/sd/source/ui/remotecontrol/Listener.cxx b/sd/source/ui/remotecontrol/Listener.cxx
index 30b29a9..2052fbf 100644
--- a/sd/source/ui/remotecontrol/Listener.cxx
+++ b/sd/source/ui/remotecontrol/Listener.cxx
@@ -10,12 +10,13 @@
 #include <comphelper/processfactory.hxx>
 #include <com/sun/star/presentation/XPresentationSupplier.hpp>
 #include <com/sun/star/presentation/XPresentation2.hpp>
-
 #include <rtl/strbuf.hxx>
+#include <vcl/svapp.hxx>
 
 #include "Listener.hxx"
 #include "ImagePreparer.hxx"
 
+
 using namespace sd;
 using namespace ::com::sun::star::presentation;
 using namespace ::com::sun::star::frame;
@@ -53,8 +54,10 @@ void Listener::init( const css::uno::Reference< css::presentation::XSlideShowCon
         pTransmitter->addMessage( aBuffer.makeStringAndClear(),
                                   Transmitter::PRIORITY_HIGH );
 
-        ImagePreparer* pPreparer = new ImagePreparer( aController, pTransmitter );
-        pPreparer->create();
+        {
+            SolarMutexGuard aGuard;
+            /* ImagePreparer* pPreparer = */ new ImagePreparer( aController, pTransmitter );
+        }
     }
     else
     {
diff --git a/sd/source/ui/remotecontrol/Receiver.cxx b/sd/source/ui/remotecontrol/Receiver.cxx
index 968fbb4..c3e7d8a 100644
--- a/sd/source/ui/remotecontrol/Receiver.cxx
+++ b/sd/source/ui/remotecontrol/Receiver.cxx
@@ -30,13 +30,35 @@ using namespace std;
 Receiver::Receiver( Transmitter *aTransmitter )
 {
     pTransmitter = aTransmitter;
+    SetTimeout( 0 );
 }
 
 Receiver::~Receiver()
 {
 }
 
-void Receiver::parseCommand( std::vector<OString> aCommand )
+// Bounce the commands to the main thread to avoid threading woes
+void Receiver::pushCommand( const std::vector<OString> &rCommand )
+{
+    SolarMutexGuard aGuard;
+    maExecQueue.push_back( rCommand );
+    Start();
+}
+
+void Receiver::Timeout()
+{
+    if( maExecQueue.size() )
+    {
+        std::vector< rtl::OString > aCommands( maExecQueue.front() );
+        maExecQueue.pop_front();
+        executeCommand( aCommands );
+        Start();
+    }
+    else
+        Stop();
+}
+
+void Receiver::executeCommand( const std::vector<OString> &aCommand )
 {
     uno::Reference<presentation::XSlideShowController> xSlideShowController;
     uno::Reference<presentation::XPresentation2> xPresentation;
diff --git a/sd/source/ui/remotecontrol/Receiver.hxx b/sd/source/ui/remotecontrol/Receiver.hxx
index 0bee508..a4a915c 100644
--- a/sd/source/ui/remotecontrol/Receiver.hxx
+++ b/sd/source/ui/remotecontrol/Receiver.hxx
@@ -16,6 +16,8 @@
 #include <com/sun/star/presentation/XPresentation2.hpp>
 #include <osl/socket.hxx>
 #include <stdlib.h>
+#include <vcl/timer.hxx>
+#include <vcl/svapp.hxx>
 
 #include <vector>
 
@@ -24,12 +26,16 @@
 namespace sd
 {
 
-class Receiver
+// Timer is protected by the solar mutex => so are we.
+class Receiver : Timer
 {
+    std::deque< std::vector< rtl::OString > > maExecQueue;
 public:
     Receiver( Transmitter *aTransmitter );
     ~Receiver();
-    void parseCommand( std::vector<rtl::OString> aCommand );
+    virtual void Timeout();
+    void pushCommand( const std::vector<rtl::OString> &rCommand );
+    void executeCommand( const std::vector<rtl::OString> &aCommand );
 
 private:
     Transmitter *pTransmitter;
diff --git a/slideshow/source/engine/slideshowimpl.cxx b/slideshow/source/engine/slideshowimpl.cxx
index cf672ae..d3cdbbe 100644
--- a/slideshow/source/engine/slideshowimpl.cxx
+++ b/slideshow/source/engine/slideshowimpl.cxx
@@ -2131,7 +2131,7 @@ sal_Bool SlideShowImpl::update( double & nNextTimeout )
 
 void SlideShowImpl::notifySlideTransitionEnded( bool bPaintSlide )
 {
-    osl::MutexGuard const guard( m_aMutex );
+    osl::ResettableMutexGuard guard( m_aMutex );
 
     OSL_ENSURE( !isDisposed(), "### already disposed!" );
     OSL_ENSURE( mpCurrentSlide,
@@ -2144,6 +2144,10 @@ void SlideShowImpl::notifySlideTransitionEnded( bool bPaintSlide )
         // the chance to register SlideStartEvents
         const bool bBackgroundLayerRendered( !bPaintSlide );
         mpCurrentSlide->show( bBackgroundLayerRendered );
+
+        uno::Reference<presentation::XSlideShow> xThis(
+                static_cast< presentation::XSlideShow * >( this ), uno::UNO_QUERY_THROW );
+        guard.reset(); // unlock
         maEventMultiplexer.notifySlideStartEvent();
     }
 }


More information about the Libreoffice-commits mailing list