summaryrefslogtreecommitdiff
path: root/binaryurp
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2014-02-07 14:28:07 +0100
committerStephan Bergmann <sbergman@redhat.com>2014-02-07 14:37:51 +0100
commitf6245d5bcb18dff2721d5975cd84711559cefe65 (patch)
treedb897f050b938ab66ac7f320a192737af8b814b8 /binaryurp
parentd4b5a9ead177579c7d8091881da91d6766fd8ff1 (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
Diffstat (limited to 'binaryurp')
-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 17a8863f6e12..440288881b57 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(