BlockingUDPTransport wrap close() to break ref. loop
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user