diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2014-02-07 14:28:07 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2014-02-07 14:37:51 +0100 |
commit | f6245d5bcb18dff2721d5975cd84711559cefe65 (patch) | |
tree | db897f050b938ab66ac7f320a192737af8b814b8 | |
parent | d4b5a9ead177579c7d8091881da91d6766fd8ff1 (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
-rw-r--r-- | binaryurp/source/bridge.cxx | 16 | ||||
-rw-r--r-- | binaryurp/source/reader.cxx | 1 | ||||
-rw-r--r-- | binaryurp/source/writer.cxx | 1 |
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( |