[Libreoffice-commits] core.git: Branch 'libreoffice-4-1' - binaryurp/source

Stephan Bergmann sbergman at redhat.com
Fri Feb 7 09:01:04 PST 2014


 binaryurp/source/bridge.cxx |   16 ++++++++++++----
 binaryurp/source/reader.cxx |    1 +
 binaryurp/source/writer.cxx |    1 +
 3 files changed, 14 insertions(+), 4 deletions(-)

New commits:
commit 2ed67ffacb14c3e33f91f9f1e78f553397beca38
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Fri Feb 7 14:28:07 2014 +0100

    fdo#56511 Don't unduly delay Bridge termination
    
    When terminate is called from the Reader or Writer thread, the final terminate
    was delayed until disposal of the BridgeFactory, as an unfortunate consequence
    of always trying to join on the Reader and Writer.  Instead, forgo the join in
    such a case and rely on the underlying osl::Thread becoming detached after
    calling termiante.
    
    Change-Id: Ifba788c4d0d2e9b14b4f7f6b5f0f1380b712ce36
    (cherry picked from commit f6245d5bcb18dff2721d5975cd84711559cefe65)
    Reviewed-on: https://gerrit.libreoffice.org/7926
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/binaryurp/source/bridge.cxx b/binaryurp/source/bridge.cxx
index 31fc342..f27f377 100644
--- a/binaryurp/source/bridge.cxx
+++ b/binaryurp/source/bridge.cxx
@@ -255,10 +255,18 @@ void Bridge::terminate(bool final) {
                         osl::MutexGuard g2(mutex_);
                         tp = threadPool_;
                         threadPool_ = 0;
-                        assert(!(reader_.is() && isThread(reader_.get())));
-                        std::swap(reader_, r);
-                        assert(!(writer_.is() && isThread(writer_.get())));
-                        std::swap(writer_, w);
+                        if (reader_.is()) {
+                            if (!isThread(reader_.get())) {
+                                r = reader_;
+                            }
+                            reader_.clear();
+                        }
+                        if (writer_.is()) {
+                            if (!isThread(writer_.get())) {
+                                w = writer_;
+                            }
+                            writer_.clear();
+                        }
                         state_ = STATE_FINAL;
                     }
                     assert(!(r.is() && w.is()));
diff --git a/binaryurp/source/reader.cxx b/binaryurp/source/reader.cxx
index 184f037..331e4b3 100644
--- a/binaryurp/source/reader.cxx
+++ b/binaryurp/source/reader.cxx
@@ -128,6 +128,7 @@ void Reader::execute() {
         SAL_WARN("binaryurp", "caught C++ exception '" << e.what() << '\'');
     }
     bridge_->terminate(false);
+    bridge_.clear();
 }
 
 void Reader::readMessage(Unmarshal & unmarshal) {
diff --git a/binaryurp/source/writer.cxx b/binaryurp/source/writer.cxx
index 3d5c199..edcb0f5 100644
--- a/binaryurp/source/writer.cxx
+++ b/binaryurp/source/writer.cxx
@@ -177,6 +177,7 @@ void Writer::execute() {
         OSL_TRACE(OSL_LOG_PREFIX "caught C++ exception '%s'", e.what());
     }
     bridge_->terminate(false);
+    bridge_.clear();
 }
 
 void Writer::sendRequest(


More information about the Libreoffice-commits mailing list