diff options
author | Michael Meeks <michael.meeks@suse.com> | 2013-01-28 20:03:20 +1100 |
---|---|---|
committer | Michael Meeks <michael.meeks@suse.com> | 2013-01-28 21:25:44 +1100 |
commit | 58b05ce98e72fe47bdca02d2dabea20c36a494bf (patch) | |
tree | 8ec43554d84030f893fee91d8335e9cbc05e90aa /sd/source | |
parent | f99e540897103b6af3bb6b6c5a36e0a77f35b706 (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
Diffstat (limited to 'sd/source')
-rw-r--r-- | sd/source/ui/remotecontrol/Communicator.cxx | 2 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/ImagePreparer.cxx | 35 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/ImagePreparer.hxx | 10 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/Listener.cxx | 9 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/Receiver.cxx | 24 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/Receiver.hxx | 10 |
6 files changed, 57 insertions, 33 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; |