desktop/source/app/app.cxx | 8 +-- desktop/source/app/dispatchwatcher.cxx | 7 --- desktop/source/app/dispatchwatcher.hxx | 7 --- desktop/source/app/officeipcthread.cxx | 67 +++++++++++++++------------------ desktop/source/app/officeipcthread.hxx | 14 +++--- 5 files changed, 45 insertions(+), 58 deletions(-)
New commits: commit 69bb5e849825e32d9fe929519813ede56ca76997 Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Mar 11 16:10:21 2016 +0100 Thread safety Change-Id: I13282ac1d6b3f1323e9056a4160301bd503ac271 diff --git a/desktop/source/app/officeipcthread.cxx b/desktop/source/app/officeipcthread.cxx index 5662823..6bf4dc5 100644 --- a/desktop/source/app/officeipcthread.cxx +++ b/desktop/source/app/officeipcthread.cxx @@ -666,6 +666,7 @@ OfficeIPCThread::~OfficeIPCThread() void OfficeIPCThread::SetReady() { + osl::MutexGuard g(GetMutex()); if (pGlobalOfficeIPCThread.is()) { pGlobalOfficeIPCThread->cReady.set(); @@ -674,7 +675,11 @@ void OfficeIPCThread::SetReady() void OfficeIPCThread::WaitForReady() { - rtl::Reference< OfficeIPCThread > const & t(pGlobalOfficeIPCThread); + rtl::Reference<OfficeIPCThread> t; + { + osl::MutexGuard g(GetMutex()); + t = pGlobalOfficeIPCThread; + } if (t.is()) { t->cReady.wait(); @@ -683,6 +688,7 @@ void OfficeIPCThread::WaitForReady() bool OfficeIPCThread::IsEnabled() { + osl::MutexGuard g(GetMutex()); return pGlobalOfficeIPCThread.is(); } commit 8db7c0de57d3c5129236fc6cfc37e93cfb75e49f Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Mar 11 16:08:05 2016 +0100 No need for a complicated arg to SetReady Change-Id: Iacb900ab7de0f01a78441019d2455abacc974617 diff --git a/desktop/source/app/officeipcthread.cxx b/desktop/source/app/officeipcthread.cxx index 6c94f62..5662823 100644 --- a/desktop/source/app/officeipcthread.cxx +++ b/desktop/source/app/officeipcthread.cxx @@ -638,7 +638,7 @@ void OfficeIPCThread::DisableOfficeIPCThread(bool join) // release mutex to avoid deadlocks aMutex.clear(); - OfficeIPCThread::SetReady(pOfficeIPCThread); + pOfficeIPCThread->cReady.set(); // exit gracefully and join if (join) @@ -664,14 +664,11 @@ OfficeIPCThread::~OfficeIPCThread() pGlobalOfficeIPCThread.clear(); } -void OfficeIPCThread::SetReady( - rtl::Reference< OfficeIPCThread > const & pThread) +void OfficeIPCThread::SetReady() { - rtl::Reference< OfficeIPCThread > const & t( - pThread.is() ? pThread : pGlobalOfficeIPCThread); - if (t.is()) + if (pGlobalOfficeIPCThread.is()) { - t->cReady.set(); + pGlobalOfficeIPCThread->cReady.set(); } } diff --git a/desktop/source/app/officeipcthread.hxx b/desktop/source/app/officeipcthread.hxx index 1319d39..919ec44 100644 --- a/desktop/source/app/officeipcthread.hxx +++ b/desktop/source/app/officeipcthread.hxx @@ -117,9 +117,7 @@ class OfficeIPCThread : public salhelper::Thread static Status EnableOfficeIPCThread(); static void DisableOfficeIPCThread(bool join = true); // start dispatching events... - static void SetReady( - rtl::Reference< OfficeIPCThread > const & pThread = - rtl::Reference< OfficeIPCThread >()); + static void SetReady(); static void WaitForReady(); static bool IsEnabled(); commit 34eb5546a1f8824c275337644d6db1c344e596fc Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Mar 11 15:47:18 2016 +0100 Turn static s_bInEnableRequests into an ExecuteCmdLineRequests arg Change-Id: Idb0b252d986bc866409928f4a126f55608c6347c diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx index a7d97de..3166b34 100644 --- a/desktop/source/app/app.cxx +++ b/desktop/source/app/app.cxx @@ -2407,7 +2407,7 @@ void Desktop::OpenClients() } // Process request - if ( OfficeIPCThread::ExecuteCmdLineRequests( aRequest ) ) + if ( OfficeIPCThread::ExecuteCmdLineRequests(aRequest, false) ) { // Don't do anything if we have successfully called terminate at desktop: return; @@ -2481,7 +2481,7 @@ void Desktop::OpenDefault() ProcessDocumentsRequest aRequest(rArgs.getCwdUrl()); aRequest.aOpenList.push_back(aName); - OfficeIPCThread::ExecuteCmdLineRequests( aRequest ); + OfficeIPCThread::ExecuteCmdLineRequests(aRequest, false); } @@ -2604,7 +2604,7 @@ void Desktop::HandleAppEvent( const ApplicationEvent& rAppEvent ) std::vector<OUString> const & data(rAppEvent.GetStringsData()); docsRequest.aOpenList.insert( docsRequest.aOpenList.end(), data.begin(), data.end()); - OfficeIPCThread::ExecuteCmdLineRequests(docsRequest); + OfficeIPCThread::ExecuteCmdLineRequests(docsRequest, false); } } break; @@ -2621,7 +2621,7 @@ void Desktop::HandleAppEvent( const ApplicationEvent& rAppEvent ) std::vector<OUString> const & data(rAppEvent.GetStringsData()); docsRequest.aPrintList.insert( docsRequest.aPrintList.end(), data.begin(), data.end()); - OfficeIPCThread::ExecuteCmdLineRequests(docsRequest); + OfficeIPCThread::ExecuteCmdLineRequests(docsRequest, false); } } break; diff --git a/desktop/source/app/officeipcthread.cxx b/desktop/source/app/officeipcthread.cxx index 00d0147..6c94f62 100644 --- a/desktop/source/app/officeipcthread.cxx +++ b/desktop/source/app/officeipcthread.cxx @@ -296,7 +296,7 @@ IMPL_STATIC_LINK_TYPED( ProcessEventsClass_Impl, ProcessDocumentsEvent, void*, p { // Documents requests are processed by the OfficeIPCThread implementation ProcessDocumentsRequest* pDocsRequest = static_cast<ProcessDocumentsRequest*>(pEvent); - OfficeIPCThread::ExecuteCmdLineRequests( *pDocsRequest ); + OfficeIPCThread::ExecuteCmdLineRequests(*pDocsRequest, false); delete pDocsRequest; } @@ -394,8 +394,6 @@ void OfficeIPCThread::SetDowning() pGlobalOfficeIPCThread->mState = State::Downing; } -static bool s_bInEnableRequests = false; - void OfficeIPCThread::EnableRequests() { // switch between just queueing the requests and executing them @@ -403,15 +401,13 @@ void OfficeIPCThread::EnableRequests() if ( pGlobalOfficeIPCThread.is() ) { - s_bInEnableRequests = true; if (pGlobalOfficeIPCThread->mState != State::Downing) { pGlobalOfficeIPCThread->mState = State::RequestsEnabled; } // hit the compiler over the head ProcessDocumentsRequest aEmptyReq = ProcessDocumentsRequest( boost::optional< OUString >() ); // trigger already queued requests - OfficeIPCThread::ExecuteCmdLineRequests( aEmptyReq ); - s_bInEnableRequests = false; + OfficeIPCThread::ExecuteCmdLineRequests(aEmptyReq, true); } } @@ -1047,7 +1043,8 @@ static void AddConversionsToDispatchList( } -bool OfficeIPCThread::ExecuteCmdLineRequests( ProcessDocumentsRequest& aRequest ) +bool OfficeIPCThread::ExecuteCmdLineRequests( + ProcessDocumentsRequest& aRequest, bool noTerminate) { // protect the dispatch list osl::ClearableMutexGuard aGuard( GetMutex() ); @@ -1084,7 +1081,7 @@ bool OfficeIPCThread::ExecuteCmdLineRequests( ProcessDocumentsRequest& aRequest aGuard.clear(); // Execute dispatch requests - bShutdown = pGlobalOfficeIPCThread->mpDispatchWatcher->executeDispatchRequests( aTempList, s_bInEnableRequests ); + bShutdown = pGlobalOfficeIPCThread->mpDispatchWatcher->executeDispatchRequests( aTempList, noTerminate); // set processed flag if (aRequest.pcProcessed != nullptr) diff --git a/desktop/source/app/officeipcthread.hxx b/desktop/source/app/officeipcthread.hxx index 13af937..1319d39 100644 --- a/desktop/source/app/officeipcthread.hxx +++ b/desktop/source/app/officeipcthread.hxx @@ -110,7 +110,8 @@ class OfficeIPCThread : public salhelper::Thread static void EnableRequests(); static bool AreRequestsPending(); static void RequestsCompleted(); - static bool ExecuteCmdLineRequests( ProcessDocumentsRequest& ); + static bool ExecuteCmdLineRequests( + ProcessDocumentsRequest&, bool noTerminate); // return sal_False if second office static Status EnableOfficeIPCThread(); commit ee31139b64eb9517619578bb02b3261b85d635ae Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Mar 11 15:34:01 2016 +0100 Combine mbDowning, mbRequestsEnabled as mState Change-Id: I3110f1690f0d7b0f19e7576f02cb1159342881a1 diff --git a/desktop/source/app/officeipcthread.cxx b/desktop/source/app/officeipcthread.cxx index 6c41f12..00d0147 100644 --- a/desktop/source/app/officeipcthread.cxx +++ b/desktop/source/app/officeipcthread.cxx @@ -391,7 +391,7 @@ void OfficeIPCThread::SetDowning() ::osl::MutexGuard aGuard( GetMutex() ); if ( pGlobalOfficeIPCThread.is() ) - pGlobalOfficeIPCThread->mbDowning = true; + pGlobalOfficeIPCThread->mState = State::Downing; } static bool s_bInEnableRequests = false; @@ -404,7 +404,9 @@ void OfficeIPCThread::EnableRequests() if ( pGlobalOfficeIPCThread.is() ) { s_bInEnableRequests = true; - pGlobalOfficeIPCThread->mbRequestsEnabled = true; + if (pGlobalOfficeIPCThread->mState != State::Downing) { + pGlobalOfficeIPCThread->mState = State::RequestsEnabled; + } // hit the compiler over the head ProcessDocumentsRequest aEmptyReq = ProcessDocumentsRequest( boost::optional< OUString >() ); // trigger already queued requests @@ -634,7 +636,7 @@ void OfficeIPCThread::DisableOfficeIPCThread(bool join) pGlobalOfficeIPCThread); pGlobalOfficeIPCThread.clear(); - pOfficeIPCThread->mbDowning = true; + pOfficeIPCThread->mState = State::Downing; pOfficeIPCThread->maPipe.close(); // release mutex to avoid deadlocks @@ -652,8 +654,7 @@ void OfficeIPCThread::DisableOfficeIPCThread(bool join) OfficeIPCThread::OfficeIPCThread() : Thread( "OfficeIPCThread" ), - mbDowning( false ), - mbRequestsEnabled( false ), + mState( State::Starting ), mnPendingRequests( 0 ) { } @@ -722,7 +723,7 @@ void OfficeIPCThread::execute() // down during wait osl::ClearableMutexGuard aGuard( GetMutex() ); - if ( mbDowning ) + if ( mState == State::Downing ) { break; } @@ -963,7 +964,7 @@ void OfficeIPCThread::execute() { { osl::MutexGuard aGuard( GetMutex() ); - if ( mbDowning ) + if ( mState == State::Downing ) { break; } diff --git a/desktop/source/app/officeipcthread.hxx b/desktop/source/app/officeipcthread.hxx index b8770c6..13af937 100644 --- a/desktop/source/app/officeipcthread.hxx +++ b/desktop/source/app/officeipcthread.hxx @@ -72,9 +72,10 @@ class OfficeIPCThread : public salhelper::Thread private: static rtl::Reference< OfficeIPCThread > pGlobalOfficeIPCThread; + enum class State { Starting, RequestsEnabled, Downing }; + osl::Pipe maPipe; - bool mbDowning; - bool mbRequestsEnabled; + State mState; int mnPendingRequests; rtl::Reference<DispatchWatcher> mpDispatchWatcher; @@ -121,7 +122,7 @@ class OfficeIPCThread : public salhelper::Thread static void WaitForReady(); static bool IsEnabled(); - bool AreRequestsEnabled() const { return mbRequestsEnabled && ! mbDowning; } + bool AreRequestsEnabled() const { return mState == State::RequestsEnabled; } }; commit f3caa92527aee3c95960e95c90e1e1cdd33f1342 Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Mar 11 15:22:14 2016 +0100 pDocsRequest cannot be null Change-Id: I399175f154e0a75779b90b74396c13fe2acbca49 diff --git a/desktop/source/app/officeipcthread.cxx b/desktop/source/app/officeipcthread.cxx index ccc72ec..6c41f12 100644 --- a/desktop/source/app/officeipcthread.cxx +++ b/desktop/source/app/officeipcthread.cxx @@ -296,12 +296,8 @@ IMPL_STATIC_LINK_TYPED( ProcessEventsClass_Impl, ProcessDocumentsEvent, void*, p { // Documents requests are processed by the OfficeIPCThread implementation ProcessDocumentsRequest* pDocsRequest = static_cast<ProcessDocumentsRequest*>(pEvent); - - if ( pDocsRequest ) - { - OfficeIPCThread::ExecuteCmdLineRequests( *pDocsRequest ); - delete pDocsRequest; - } + OfficeIPCThread::ExecuteCmdLineRequests( *pDocsRequest ); + delete pDocsRequest; } void ImplPostForeignAppEvent( ApplicationEvent* pEvent ) commit 1290a4082c298eecd597a7f268b6a19e1e64e9b8 Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Mar 11 15:05:55 2016 +0100 Create DispatchRequest via list-initialization Change-Id: Ic1fc17b028281e64290c6c1d25bbd94fbf27251d diff --git a/desktop/source/app/dispatchwatcher.hxx b/desktop/source/app/dispatchwatcher.hxx index 087d338..f78db4f 100644 --- a/desktop/source/app/dispatchwatcher.hxx +++ b/desktop/source/app/dispatchwatcher.hxx @@ -58,9 +58,6 @@ class DispatchWatcher : public ::cppu::WeakImplHelper< css::frame::XDispatchResu struct DispatchRequest { - DispatchRequest( RequestType aType, const OUString& aFile, boost::optional< OUString > const & cwdUrl, const OUString& aPrinter, const OUString& aFact ) : - aRequestType( aType ), aURL( aFile ), aCwdUrl( cwdUrl ), aPrinterName( aPrinter ), aPreselectedFactory( aFact ) {} - RequestType aRequestType; OUString aURL; boost::optional< OUString > aCwdUrl; diff --git a/desktop/source/app/officeipcthread.cxx b/desktop/source/app/officeipcthread.cxx index 9260840..ccc72ec 100644 --- a/desktop/source/app/officeipcthread.cxx +++ b/desktop/source/app/officeipcthread.cxx @@ -996,8 +996,7 @@ static void AddToDispatchList( for (std::vector< OUString >::const_iterator i(aRequestList.begin()); i != aRequestList.end(); ++i) { - rDispatchList.push_back( - DispatchWatcher::DispatchRequest( nType, *i, cwdUrl, aParam, aFactory )); + rDispatchList.push_back({nType, *i, cwdUrl, aParam, aFactory}); } } @@ -1046,8 +1045,7 @@ static void AddConversionsToDispatchList( for (std::vector< OUString >::const_iterator i(rRequestList.begin()); i != rRequestList.end(); ++i) { - rDispatchList.push_back( - DispatchWatcher::DispatchRequest( nType, *i, cwdUrl, aParam, rFactory )); + rDispatchList.push_back({nType, *i, cwdUrl, aParam, rFactory}); } } commit 2cc88911db9cf81e09270a49c0ee7a13600aa3ab Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Mar 11 15:01:23 2016 +0100 Resolve trivial DispatchList typedef Change-Id: I5a304701aed843f6cdbffcdcf6e04255453f0f48 diff --git a/desktop/source/app/dispatchwatcher.cxx b/desktop/source/app/dispatchwatcher.cxx index 63e08c7..1952e59 100644 --- a/desktop/source/app/dispatchwatcher.cxx +++ b/desktop/source/app/dispatchwatcher.cxx @@ -180,7 +180,7 @@ DispatchWatcher::~DispatchWatcher() } -bool DispatchWatcher::executeDispatchRequests( const DispatchList& aDispatchRequestsList, bool bNoTerminate ) +bool DispatchWatcher::executeDispatchRequests( const std::vector<DispatchRequest>& aDispatchRequestsList, bool bNoTerminate ) { Reference< XDesktop2 > xDesktop = css::frame::Desktop::create( ::comphelper::getProcessComponentContext() ); diff --git a/desktop/source/app/dispatchwatcher.hxx b/desktop/source/app/dispatchwatcher.hxx index a71c54b..087d338 100644 --- a/desktop/source/app/dispatchwatcher.hxx +++ b/desktop/source/app/dispatchwatcher.hxx @@ -68,8 +68,6 @@ class DispatchWatcher : public ::cppu::WeakImplHelper< css::frame::XDispatchResu OUString aPreselectedFactory; }; - typedef std::vector< DispatchRequest > DispatchList; - DispatchWatcher(); virtual ~DispatchWatcher(); @@ -82,7 +80,7 @@ class DispatchWatcher : public ::cppu::WeakImplHelper< css::frame::XDispatchResu virtual void SAL_CALL dispatchFinished( const css::frame::DispatchResultEvent& aEvent ) throw( css::uno::RuntimeException, std::exception ) override; // execute new dispatch request - bool executeDispatchRequests( const DispatchList& aDispatches, bool bNoTerminate = false ); + bool executeDispatchRequests( const std::vector<DispatchRequest>& aDispatches, bool bNoTerminate = false ); private: osl::Mutex m_mutex; diff --git a/desktop/source/app/officeipcthread.cxx b/desktop/source/app/officeipcthread.cxx index 7d1ebf4..9260840 100644 --- a/desktop/source/app/officeipcthread.cxx +++ b/desktop/source/app/officeipcthread.cxx @@ -986,7 +986,7 @@ void OfficeIPCThread::execute() } static void AddToDispatchList( - DispatchWatcher::DispatchList& rDispatchList, + std::vector<DispatchWatcher::DispatchRequest>& rDispatchList, boost::optional< OUString > const & cwdUrl, std::vector< OUString > const & aRequestList, DispatchWatcher::RequestType nType, @@ -1002,7 +1002,7 @@ static void AddToDispatchList( } static void AddConversionsToDispatchList( - DispatchWatcher::DispatchList& rDispatchList, + std::vector<DispatchWatcher::DispatchRequest>& rDispatchList, boost::optional< OUString > const & cwdUrl, std::vector< OUString > const & rRequestList, const OUString& rParam, @@ -1057,7 +1057,7 @@ bool OfficeIPCThread::ExecuteCmdLineRequests( ProcessDocumentsRequest& aRequest // protect the dispatch list osl::ClearableMutexGuard aGuard( GetMutex() ); - static DispatchWatcher::DispatchList aDispatchList; + static std::vector<DispatchWatcher::DispatchRequest> aDispatchList; // Create dispatch list for dispatch watcher AddToDispatchList( aDispatchList, aRequest.aCwdUrl, aRequest.aInFilter, DispatchWatcher::REQUEST_INFILTER, "", aRequest.aModule ); @@ -1083,7 +1083,7 @@ bool OfficeIPCThread::ExecuteCmdLineRequests( ProcessDocumentsRequest& aRequest } // copy for execute - DispatchWatcher::DispatchList aTempList( aDispatchList ); + std::vector<DispatchWatcher::DispatchRequest> aTempList( aDispatchList ); aDispatchList.clear(); aGuard.clear(); commit 9095c5495b0760aef4bd0a4f9539e2178a11063a Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Mar 11 14:57:33 2016 +0100 Use range-based for loop Change-Id: Icf9dd7ffdc39ff64e9eac11050c8bfbfef6f004d diff --git a/desktop/source/app/dispatchwatcher.cxx b/desktop/source/app/dispatchwatcher.cxx index 35864f1..63e08c7 100644 --- a/desktop/source/app/dispatchwatcher.cxx +++ b/desktop/source/app/dispatchwatcher.cxx @@ -184,16 +184,13 @@ bool DispatchWatcher::executeDispatchRequests( const DispatchList& aDispatchRequ { Reference< XDesktop2 > xDesktop = css::frame::Desktop::create( ::comphelper::getProcessComponentContext() ); - DispatchList::const_iterator p; std::vector< DispatchHolder > aDispatches; OUString aAsTemplateArg( "AsTemplate" ); bool bSetInputFilter = false; OUString aForcedInputFilter; - for ( p = aDispatchRequestsList.begin(); p != aDispatchRequestsList.end(); ++p ) + for (auto const & aDispatchRequest: aDispatchRequestsList) { - const DispatchRequest& aDispatchRequest = *p; - // create parameter array sal_Int32 nCount = 4; if ( !aDispatchRequest.aPreselectedFactory.isEmpty() ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits