summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2014-02-07 14:28:07 +0100
committerCaolán McNamara <caolanm@redhat.com>2014-02-07 15:06:12 +0000
commit5e161e9ee63377679fc57f33a216ca4707276700 (patch)
tree8678365b48366d4777c1dba12475d4da223b4aea
parentbe3bba0ea08118b10ab0d42540c6ddb1c7b18b26 (diff)
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/7919 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--binaryurp/source/bridge.cxx16
-rw-r--r--binaryurp/source/reader.cxx1
-rw-r--r--binaryurp/source/writer.cxx1
3 files changed, 14 insertions, 4 deletions
diff --git a/binaryurp/source/bridge.cxx b/binaryurp/source/bridge.cxx
index cb69b0c09859..63cc9a70a85e 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 184f037721b9..331e4b333465 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 3d5c199befa0..edcb0f5090ce 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(