BlockingUDPTransport wrap close() to break ref. loop

This commit is contained in:
Michael Davidsaver
2017-06-02 12:32:12 +02:00
parent 11cc395baf
commit 6fcfd60bd5
3 changed files with 26 additions and 1 deletions

View File

@@ -16,6 +16,22 @@
using namespace std;
using namespace epics::pvData;
namespace {
struct closer {
epics::pvAccess::Transport::shared_pointer P;
closer(const epics::pvAccess::Transport::shared_pointer& P) :P(P) {}
void operator()(epics::pvAccess::Transport*) {
try{
P->close();
}catch(...){
P.reset();
throw;
}
P.reset();
}
};
}
namespace epics {
namespace pvAccess {
@@ -72,7 +88,10 @@ Transport::shared_pointer BlockingUDPConnector::connect(TransportClient::shared_
BlockingUDPTransport::shared_pointer transport(new BlockingUDPTransport(_serverFlag, responseHandler,
socket, bindAddress, transportRevision));
return Transport::shared_pointer(transport);
// the worker thread holds a strong ref, which is released by transport->close()
Transport::shared_pointer ret(transport.get(), closer(transport));
return ret;
}
}