Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/1915

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/15/1915/1

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.

The following commits got squashed into one:

(cherry picked from commit f07efaa3bbeb6c2160d6ccbe83ea4183df7115a3)
(cherry picked from commit 88cb36db72775c116c4721163763beb1b2ec0ea3)
(cherry picked from commit 9b696a67f92c7206fe947996931995a70229752e)

Change-Id: I7e825228fcc7ba4e1c40a161c29a0f9a371abdfb
Signed-off-by: Thorsten Behrens <tbehrens@suse.com>
---
M sd/source/ui/remotecontrol/Communicator.cxx
M sd/source/ui/remotecontrol/ImagePreparer.cxx
M sd/source/ui/remotecontrol/ImagePreparer.hxx
M sd/source/ui/remotecontrol/Listener.cxx
M sd/source/ui/remotecontrol/Receiver.cxx
M sd/source/ui/remotecontrol/Receiver.hxx
6 files changed, 55 insertions(+), 33 deletions(-)



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 @@
         }
         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..3530a4a 100644
--- a/sd/source/ui/remotecontrol/ImagePreparer.cxx
+++ b/sd/source/ui/remotecontrol/ImagePreparer.cxx
@@ -50,36 +50,29 @@
  :  xController( rxController ),
     pTransmitter( aTransmitter )
 {
+    SetTimeout( 50 );
+    mnSendingSlide = 0;
+    Start();
 }
 
 ImagePreparer::~ImagePreparer()
 {
+    Stop();
 }
 
-void SAL_CALL ImagePreparer::run()
+void 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 );
+        sendPreview( mnSendingSlide );
+        sendNotes( mnSendingSlide );
+        mnSendingSlide++;
+        Start();
     }
-    for ( sal_uInt32 i = 0; i < aSlides; i++ )
-    {
-        if ( !xController->isRunning() ) // stopped/disposed of.
-        {
-            break;
-        }
-        sendNotes( i );
-    }
-}
-
-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 @@
     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,11 +10,12 @@
 #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;
@@ -53,8 +54,10 @@
         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 @@
 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;

-- 
To view, visit https://gerrit.libreoffice.org/1915
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7e825228fcc7ba4e1c40a161c29a0f9a371abdfb
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0-0
Gerrit-Owner: Thorsten Behrens <tbehrens@suse.com>
Gerrit-Reviewer: Michael Meeks <michael.meeks@suse.com>

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.