Commit 54e0fde1 authored by Martin Hurton's avatar Martin Hurton

Resolve issue #949

parent 36d529cb
...@@ -386,6 +386,26 @@ int zmq::ctx_t::register_endpoint (const char *addr_, ...@@ -386,6 +386,26 @@ int zmq::ctx_t::register_endpoint (const char *addr_,
return 0; return 0;
} }
int zmq::ctx_t::unregister_endpoint (
const std::string &addr_, socket_base_t *socket_)
{
endpoints_sync.lock ();
const endpoints_t::iterator it = endpoints.find (addr_);
if (it == endpoints.end () || it->second.socket != socket_) {
endpoints_sync.unlock ();
errno = ENOENT;
return -1;
}
// Remove endpoint.
endpoints.erase (it);
endpoints_sync.unlock ();
return 0;
}
void zmq::ctx_t::unregister_endpoints (socket_base_t *socket_) void zmq::ctx_t::unregister_endpoints (socket_base_t *socket_)
{ {
endpoints_sync.lock (); endpoints_sync.lock ();
......
...@@ -104,6 +104,7 @@ namespace zmq ...@@ -104,6 +104,7 @@ namespace zmq
// Management of inproc endpoints. // Management of inproc endpoints.
int register_endpoint (const char *addr_, const endpoint_t &endpoint_); int register_endpoint (const char *addr_, const endpoint_t &endpoint_);
int unregister_endpoint (const std::string &addr_, socket_base_t *socket_);
void unregister_endpoints (zmq::socket_base_t *socket_); void unregister_endpoints (zmq::socket_base_t *socket_);
endpoint_t find_endpoint (const char *addr_); endpoint_t find_endpoint (const char *addr_);
void pend_connection (const std::string &addr_, void pend_connection (const std::string &addr_,
......
...@@ -143,6 +143,12 @@ int zmq::object_t::register_endpoint (const char *addr_, ...@@ -143,6 +143,12 @@ int zmq::object_t::register_endpoint (const char *addr_,
return ctx->register_endpoint (addr_, endpoint_); return ctx->register_endpoint (addr_, endpoint_);
} }
int zmq::object_t::unregister_endpoint (
const std::string &addr_, socket_base_t *socket_)
{
return ctx->unregister_endpoint (addr_, socket_);
}
void zmq::object_t::unregister_endpoints (socket_base_t *socket_) void zmq::object_t::unregister_endpoints (socket_base_t *socket_)
{ {
return ctx->unregister_endpoints (socket_); return ctx->unregister_endpoints (socket_);
......
...@@ -61,6 +61,8 @@ namespace zmq ...@@ -61,6 +61,8 @@ namespace zmq
// repository of inproc endpoints. // repository of inproc endpoints.
int register_endpoint (const char *addr_, int register_endpoint (const char *addr_,
const zmq::endpoint_t &endpoint_); const zmq::endpoint_t &endpoint_);
int unregister_endpoint (
const std::string &addr_, socket_base_t *socket_);
void unregister_endpoints (zmq::socket_base_t *socket_); void unregister_endpoints (zmq::socket_base_t *socket_);
zmq::endpoint_t find_endpoint (const char *addr_); zmq::endpoint_t find_endpoint (const char *addr_);
void pend_connection (const std::string &addr_, void pend_connection (const std::string &addr_,
......
...@@ -743,6 +743,8 @@ int zmq::socket_base_t::term_endpoint (const char *addr_) ...@@ -743,6 +743,8 @@ int zmq::socket_base_t::term_endpoint (const char *addr_)
// Disconnect an inproc socket // Disconnect an inproc socket
if (protocol == "inproc") { if (protocol == "inproc") {
if (unregister_endpoint (std::string (addr_), this) == 0)
return 0;
std::pair <inprocs_t::iterator, inprocs_t::iterator> range = inprocs.equal_range (std::string (addr_)); std::pair <inprocs_t::iterator, inprocs_t::iterator> range = inprocs.equal_range (std::string (addr_));
if (range.first == range.second) { if (range.first == range.second) {
errno = ENOENT; errno = ENOENT;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment