summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@suse.com>2013-01-28 20:03:20 +1100
committerMichael Meeks <michael.meeks@suse.com>2013-01-28 21:25:44 +1100
commit58b05ce98e72fe47bdca02d2dabea20c36a494bf (patch)
tree8ec43554d84030f893fee91d8335e9cbc05e90aa
parentf99e540897103b6af3bb6b6c5a36e0a77f35b706 (diff)
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. Change-Id: I5f5e8d6fbc2e059d4194f72f3e086e1aa87ab2cc
-rw-r--r--sd/source/ui/remotecontrol/Communicator.cxx2
-rw-r--r--sd/source/ui/remotecontrol/ImagePreparer.cxx35
-rw-r--r--sd/source/ui/remotecontrol/ImagePreparer.hxx10
-rw-r--r--sd/source/ui/remotecontrol/Listener.cxx9
-rw-r--r--sd/source/ui/remotecontrol/Receiver.cxx24
-rw-r--r--sd/source/ui/remotecontrol/Receiver.hxx10
-rw-r--r--slideshow/source/engine/slideshowimpl.cxx6
7 files changed, 62 insertions, 34 deletions
diff --git a/sd/source/ui/remotecontrol/Communicator.cxx b/sd/source/ui/remotecontrol/Communicator.cxx
index ebe5627e2442..84467da26eb4 100644
--- a/sd/source/ui/remotecontrol/Communicator.cxx
+++ b/sd/source/ui/remotecontrol/Communicator.cxx
@@ -79,7 +79,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 66b2791253e8..b81b3ab69350 100644
--- a/sd/source/ui/remotecontrol/ImagePreparer.cxx
+++ b/sd/source/ui/remotecontrol/ImagePreparer.cxx
@@ -50,36 +50,31 @@ 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++ )
+// fprintf( stderr, "ImagePreparer: %d %d %d\n", xController->isRunning(),
+// (int)mnSendingSlide, (int)aSlides);
+ 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 aa013d766c16..66b30aeeee4c 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 30b29a90a4ce..2052fbf4d065 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 e0d05b0b09ea..572551d9e93e 100644
--- a/sd/source/ui/remotecontrol/Receiver.cxx
+++ b/sd/source/ui/remotecontrol/Receiver.cxx
@@ -31,13 +31,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 0bee508089d5..a4a915c4b3a9 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 cf672ae296ac..d3cdbbea6ae7 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();
}
}