diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2018-12-26 00:17:12 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2018-12-25 23:32:54 +0100 |
commit | b1491ff14a22639775dd8b8ca130258a1b95421b (patch) | |
tree | b631e942fdc82b13628d17c7073161661ef17503 | |
parent | 48b35ed43db87d21a943e66cfa4f59213dcfe3a1 (diff) |
tdf#120676: don't send "processing done" when refused to process
After commit cf333a878ceed18d0343520a2c65be69fc433b1f, condition
RequestHandler::cProcessed is set regardless if the request was
processed in RequestHandler::ExecuteCmdLineRequests. This allows
PipeIpcThread::execute to avoid infinite wait for the condition
object that is never signaled. But this makes the latter function
to send PROCESSING_DONE to the calling process. So the secondary
process gets no hint that the request actually failed.
This change adds a boolean field to signal if the request really
was processed. In the case of refused processing (i.e., when
pGlobal.is() is false, or when !pGlobal->AreRequestsEnabled() is
true, like when shutting down), the secondary process would get
empty response to its request in PipeIpcThread::enable, instead
of expected PROCESSING_DONE, and thus the process will eventually
exit with non-0 error code, which would allow to detect this in
scripts.
Change-Id: Id91ea28025e3f3ab60c7049f02ed9fc226d2a654
Reviewed-on: https://gerrit.libreoffice.org/65610
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
-rw-r--r-- | desktop/source/app/officeipcthread.cxx | 25 | ||||
-rw-r--r-- | desktop/source/app/officeipcthread.hxx | 3 |
2 files changed, 21 insertions, 7 deletions
diff --git a/desktop/source/app/officeipcthread.cxx b/desktop/source/app/officeipcthread.cxx index 3b7ba4633d06..2871072e418b 100644 --- a/desktop/source/app/officeipcthread.cxx +++ b/desktop/source/app/officeipcthread.cxx @@ -980,6 +980,8 @@ bool IpcThread::process(OString const & arguments, bool * waitProcessed) { aCmdLineArgs->getCwdUrl()); m_handler->cProcessed.reset(); pRequest->pcProcessed = &m_handler->cProcessed; + m_handler->mbSucces = false; + pRequest->mpbSuccess = &m_handler->mbSucces; // Print requests are not dependent on the --invisible cmdline argument as they are // loaded with the "hidden" flag! So they are always checked. @@ -1178,17 +1180,24 @@ void PipeIpcThread::execute() // we don't need the mutex any longer... aGuard.clear(); + bool bSuccess = true; // wait for processing to finish if (waitProcessed) + { m_handler->cProcessed.wait(); - // processing finished, inform the requesting end: - SAL_INFO("desktop.app", "writing <" << PROCESSING_DONE << ">"); - n = aStreamPipe.write( - PROCESSING_DONE, SAL_N_ELEMENTS(PROCESSING_DONE)); + bSuccess = m_handler->mbSucces; + } + if (bSuccess) + { + // processing finished, inform the requesting end: + SAL_INFO("desktop.app", "writing <" << PROCESSING_DONE << ">"); + n = aStreamPipe.write(PROCESSING_DONE, SAL_N_ELEMENTS(PROCESSING_DONE)); // incl. terminating NUL - if (n != SAL_N_ELEMENTS(PROCESSING_DONE)) { - SAL_WARN("desktop.app", "short write: " << n); - continue; + if (n != SAL_N_ELEMENTS(PROCESSING_DONE)) + { + SAL_WARN("desktop.app", "short write: " << n); + continue; + } } } else @@ -1350,6 +1359,8 @@ bool RequestHandler::ExecuteCmdLineRequests( // Execute dispatch requests bShutdown = dispatchWatcher->executeDispatchRequests( aTempList, noTerminate); + if (aRequest.mpbSuccess) + *aRequest.mpbSuccess = true; // signal that we have actually succeeded } return bShutdown; diff --git a/desktop/source/app/officeipcthread.hxx b/desktop/source/app/officeipcthread.hxx index 4634aef87590..224f154e0cce 100644 --- a/desktop/source/app/officeipcthread.hxx +++ b/desktop/source/app/officeipcthread.hxx @@ -64,6 +64,7 @@ struct ProcessDocumentsRequest OUString aImageConversionType; std::vector< OUString > aInFilter; ::osl::Condition *pcProcessed; // pointer condition to be set when the request has been processed + bool* mpbSuccess = nullptr; // pointer to boolean receiving if the processing was successful bool bTextCat; // boolean flag indicating whether to dump text content to console bool bScriptCat; // boolean flag indicating whether to dump script content to console }; @@ -91,6 +92,8 @@ class RequestHandler: public salhelper::SimpleReferenceObject /* condition to be set when the request has been processed */ ::osl::Condition cProcessed; + /* receives if the processing was successful (may be false e.g. when shutting down) */ + bool mbSucces = false; /* condition to be set when the main event loop is ready otherwise an error dialogs event loop could eat away |