summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Oleynik (GitHub) <aoleynik@luxoft.com>2017-12-07 15:02:39 +0200
committerAndriy Byzhynar <AByzhynar@luxoft.com>2018-01-18 12:03:51 +0200
commit88790ab9e9016df4edf87b07677b8608c89a8cfd (patch)
treece4939dc7dda09621157688dba91669be284ea82
parent80ab0447c4e0750bf2536409ad0f6b0a8b8c63d0 (diff)
downloadsdl_core-88790ab9e9016df4edf87b07677b8608c89a8cfd.tar.gz
Fixes thread stopping in case no one connected to the pipe
-rw-r--r--src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc b/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc
index 13cdf5698b..b790add0c4 100644
--- a/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc
+++ b/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc
@@ -83,6 +83,9 @@ IAP2USBEmulationTransportAdapter::IAP2USBEmulationTransportAdapter(
IAP2USBEmulationTransportAdapter::~IAP2USBEmulationTransportAdapter() {
signal_handler_->join();
+ auto delegate = signal_handler_->delegate();
+ signal_handler_->set_delegate(NULL);
+ delete delegate;
threads::DeleteThread(signal_handler_);
LOG4CXX_DEBUG(logger_, "Out close result: " << close(out_));
LOG4CXX_DEBUG(logger_, "Out unlink result: " << unlink(out_signals_channel));
@@ -139,6 +142,9 @@ void IAP2USBEmulationTransportAdapter::IAPSignalHandlerDelegate::threadMain() {
adapter_.DoTransportSwitch();
}
}
+
+ LOG4CXX_DEBUG(logger_, "In close result: " << close(in_));
+ LOG4CXX_DEBUG(logger_, "In unlink result: " << unlink(in_signals_channel));
}
void IAP2USBEmulationTransportAdapter::IAPSignalHandlerDelegate::
@@ -146,8 +152,11 @@ void IAP2USBEmulationTransportAdapter::IAPSignalHandlerDelegate::
LOG4CXX_AUTO_TRACE(logger_);
LOG4CXX_DEBUG(logger_, "Stopping signal handling.");
run_flag_ = false;
- LOG4CXX_DEBUG(logger_, "In close result: " << close(in_));
- LOG4CXX_DEBUG(logger_, "In unlink result: " << unlink(in_signals_channel));
+ if (!in_) {
+ // To stop thread gracefully in case of no one has connected to pipe before
+ auto in = open(in_signals_channel, O_WRONLY);
+ UNUSED(in);
+ }
}
}
} // namespace transport_manager::transport_adapter