diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2016-03-29 14:22:58 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2016-03-29 14:22:58 +0200 |
commit | a91272a6a423e911b832b2f103a77521b4106ed1 (patch) | |
tree | 3db38425fd36dace6c4fd1d99eec7933e4f94d0c /desktop | |
parent | bc14ec0f86647a39a954bd1c32b1671c22d7f475 (diff) |
Extract PipeReaderThread from OfficeIPCThread (a misnomer, now)
Change-Id: Ie30cc14bdc772fd898d24a3e3caf41ac9718712f
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/source/app/officeipcthread.cxx | 67 | ||||
-rw-r--r-- | desktop/source/app/officeipcthread.hxx | 11 |
2 files changed, 50 insertions, 28 deletions
diff --git a/desktop/source/app/officeipcthread.cxx b/desktop/source/app/officeipcthread.cxx index 5cc1df3562f1..74d8f5d998d0 100644 --- a/desktop/source/app/officeipcthread.cxx +++ b/desktop/source/app/officeipcthread.cxx @@ -368,6 +368,23 @@ throw( RuntimeException, std::exception ) { } +class PipeReaderThread: public salhelper::Thread { +public: + PipeReaderThread(OfficeIPCThread & ipc, osl::Pipe const & pipe): + Thread("PipeReader"), ipc_(ipc), pipe_(pipe) + {} + + void close() { pipe_.close(); } + +private: + virtual ~PipeReaderThread() {} + + void execute() override; + + OfficeIPCThread & ipc_; + osl::Pipe pipe_; +}; + namespace { class theOfficeIPCThreadMutex @@ -439,7 +456,7 @@ OfficeIPCThread::Status OfficeIPCThread::EnableOfficeIPCThread() OUString aUserInstallPath; OUString aDummy; - rtl::Reference< OfficeIPCThread > pThread(new OfficeIPCThread); + osl::Pipe pipe; PipeMode nPipeMode = PIPEMODE_DONTKNOW; @@ -525,14 +542,14 @@ OfficeIPCThread::Status OfficeIPCThread::EnableOfficeIPCThread() osl::Security security; // Try to create pipe - if ( pThread->maPipe.create( aPipeIdent.getStr(), osl_Pipe_CREATE, security )) + if ( pipe.create( aPipeIdent.getStr(), osl_Pipe_CREATE, security )) { // Pipe created nPipeMode = PIPEMODE_CREATED; } - else if( pThread->maPipe.create( aPipeIdent.getStr(), osl_Pipe_OPEN, security )) // Creation not successful, now we try to connect + else if( pipe.create( aPipeIdent.getStr(), osl_Pipe_OPEN, security )) // Creation not successful, now we try to connect { - osl::StreamPipe aStreamPipe(pThread->maPipe.getHandle()); + osl::StreamPipe aStreamPipe(pipe.getHandle()); if (readStringFromPipe(aStreamPipe) == SEND_ARGUMENTS) { // Pipe connected to first office @@ -549,7 +566,7 @@ OfficeIPCThread::Status OfficeIPCThread::EnableOfficeIPCThread() } else { - oslPipeError eReason = pThread->maPipe.getError(); + oslPipeError eReason = pipe.getError(); if ((eReason == osl_Pipe_E_ConnectionRefused) || (eReason == osl_Pipe_E_invalidError)) return IPC_STATUS_PIPE_ERROR; @@ -567,13 +584,15 @@ OfficeIPCThread::Status OfficeIPCThread::EnableOfficeIPCThread() if ( nPipeMode == PIPEMODE_CREATED ) { // Seems we are the one and only, so start listening thread + rtl::Reference< OfficeIPCThread > pThread(new OfficeIPCThread); + pThread->mPipeReaderThread = new PipeReaderThread(*pThread, pipe); pGlobalOfficeIPCThread = pThread; - pThread->launch(); + pThread->mPipeReaderThread->launch(); } else { // Seems another office is running. Pipe arguments to it and self terminate - osl::StreamPipe aStreamPipe(pThread->maPipe.getHandle()); + osl::StreamPipe aStreamPipe(pipe.getHandle()); OStringBuffer aArguments(ARGUMENT_PREFIX); OUString cwdUrl; @@ -610,7 +629,6 @@ OfficeIPCThread::Status OfficeIPCThread::EnableOfficeIPCThread() #else rtl::Reference< OfficeIPCThread > pThread(new OfficeIPCThread); pGlobalOfficeIPCThread = pThread; - pThread->launch(); #endif return IPC_STATUS_OK; } @@ -626,7 +644,9 @@ void OfficeIPCThread::DisableOfficeIPCThread(bool join) pGlobalOfficeIPCThread.clear(); pOfficeIPCThread->mState = State::Downing; - pOfficeIPCThread->maPipe.close(); + if (pOfficeIPCThread->mPipeReaderThread.is()) { + pOfficeIPCThread->mPipeReaderThread->close(); + } // release mutex to avoid deadlocks aMutex.clear(); @@ -634,15 +654,15 @@ void OfficeIPCThread::DisableOfficeIPCThread(bool join) pOfficeIPCThread->cReady.set(); // exit gracefully and join - if (join) + if (join && pOfficeIPCThread->mPipeReaderThread.is()) { - pOfficeIPCThread->join(); + pOfficeIPCThread->mPipeReaderThread->join(); + pOfficeIPCThread->mPipeReaderThread.clear(); } } } OfficeIPCThread::OfficeIPCThread() : - Thread( "OfficeIPCThread" ), mState( State::Starting ), mnPendingRequests( 0 ) { @@ -650,6 +670,7 @@ OfficeIPCThread::OfficeIPCThread() : OfficeIPCThread::~OfficeIPCThread() { + assert(!mPipeReaderThread.is()); } void OfficeIPCThread::SetReady() @@ -680,7 +701,7 @@ bool OfficeIPCThread::IsEnabled() return pGlobalOfficeIPCThread.is(); } -void OfficeIPCThread::execute() +void PipeReaderThread::execute() { #if HAVE_FEATURE_DESKTOP @@ -690,7 +711,7 @@ void OfficeIPCThread::execute() do { osl::StreamPipe aStreamPipe; - oslPipeError nError = maPipe.accept( aStreamPipe ); + oslPipeError nError = pipe_.accept( aStreamPipe ); if( nError == osl_Pipe_E_None ) @@ -699,16 +720,16 @@ void OfficeIPCThread::execute() // bootstrap, that dialogs event loop might get events that are dispatched by this thread // we have to wait for cReady to be set by the real main loop. // only requests that don't dispatch events may be processed before cReady is set. - cReady.wait(); + ipc_.cReady.wait(); // we might have decided to shutdown while we were sleeping - if (!pGlobalOfficeIPCThread.is()) return; + if (!ipc_.pGlobalOfficeIPCThread.is()) return; // only lock the mutex when processing starts, othewise we deadlock when the office goes // down during wait - osl::ClearableMutexGuard aGuard( GetMutex() ); + osl::ClearableMutexGuard aGuard( OfficeIPCThread::GetMutex() ); - if ( mState == State::Downing ) + if ( ipc_.mState == OfficeIPCThread::State::Downing ) { break; } @@ -791,8 +812,8 @@ void OfficeIPCThread::execute() ProcessDocumentsRequest* pRequest = new ProcessDocumentsRequest( aCmdLineArgs->getCwdUrl()); - cProcessed.reset(); - pRequest->pcProcessed = &cProcessed; + ipc_.cProcessed.reset(); + pRequest->pcProcessed = &ipc_.cProcessed; // Print requests are not dependent on the --invisible cmdline argument as they are // loaded with the "hidden" flag! So they are always checked. @@ -933,7 +954,7 @@ void OfficeIPCThread::execute() aGuard.clear(); // wait for processing to finish if (bDocRequestSent) - cProcessed.wait(); + ipc_.cProcessed.wait(); // processing finished, inform the requesting end: n = aStreamPipe.write( PROCESSING_DONE, SAL_N_ELEMENTS(PROCESSING_DONE)); @@ -946,8 +967,8 @@ void OfficeIPCThread::execute() else { { - osl::MutexGuard aGuard( GetMutex() ); - if ( mState == State::Downing ) + osl::MutexGuard aGuard( OfficeIPCThread::GetMutex() ); + if ( ipc_.mState == OfficeIPCThread::State::Downing ) { break; } diff --git a/desktop/source/app/officeipcthread.hxx b/desktop/source/app/officeipcthread.hxx index 919ec44d8938..9cebde5beab2 100644 --- a/desktop/source/app/officeipcthread.hxx +++ b/desktop/source/app/officeipcthread.hxx @@ -67,17 +67,21 @@ struct ProcessDocumentsRequest }; class DispatchWatcher; -class OfficeIPCThread : public salhelper::Thread +class PipeReaderThread; + +class OfficeIPCThread: public salhelper::SimpleReferenceObject { + friend PipeReaderThread; + private: static rtl::Reference< OfficeIPCThread > pGlobalOfficeIPCThread; enum class State { Starting, RequestsEnabled, Downing }; - osl::Pipe maPipe; State mState; int mnPendingRequests; rtl::Reference<DispatchWatcher> mpDispatchWatcher; + rtl::Reference<PipeReaderThread> mPipeReaderThread; /* condition to be set when the request has been processed */ ::osl::Condition cProcessed; @@ -93,9 +97,6 @@ class OfficeIPCThread : public salhelper::Thread virtual ~OfficeIPCThread(); - /// Working method which should be overridden - virtual void execute() override; - public: enum Status { |