summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2016-03-29 14:22:58 +0200
committerStephan Bergmann <sbergman@redhat.com>2016-03-29 14:22:58 +0200
commita91272a6a423e911b832b2f103a77521b4106ed1 (patch)
tree3db38425fd36dace6c4fd1d99eec7933e4f94d0c /desktop
parentbc14ec0f86647a39a954bd1c32b1671c22d7f475 (diff)
Extract PipeReaderThread from OfficeIPCThread (a misnomer, now)
Change-Id: Ie30cc14bdc772fd898d24a3e3caf41ac9718712f
Diffstat (limited to 'desktop')
-rw-r--r--desktop/source/app/officeipcthread.cxx67
-rw-r--r--desktop/source/app/officeipcthread.hxx11
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
{