[Libreoffice-commits] core.git: desktop/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Tue Dec 25 22:33:17 UTC 2018


 desktop/source/app/officeipcthread.cxx |   25 ++++++++++++++++++-------
 desktop/source/app/officeipcthread.hxx |    3 +++
 2 files changed, 21 insertions(+), 7 deletions(-)

New commits:
commit b1491ff14a22639775dd8b8ca130258a1b95421b
Author:     Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Wed Dec 26 00:17:12 2018 +0300
Commit:     Mike Kaganski <mike.kaganski at collabora.com>
CommitDate: Tue Dec 25 23:32:54 2018 +0100

    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 at collabora.com>

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


More information about the Libreoffice-commits mailing list