0
0
mirror of https://github.com/zeromq/libzmq.git synced 2024-12-26 06:41:03 +08:00

Merge pull request #123 from calid/libzmq-949-backport

backport zeromq/libzmq#949 fixes to 3-x stable
This commit is contained in:
Pieter Hintjens 2015-06-29 23:37:00 +02:00
commit b56cb96783
10 changed files with 132 additions and 3 deletions

2
.gitignore vendored
View File

@ -43,6 +43,8 @@ tests/test_connect_delay
tests/test_term_endpoint
tests/test_router_mandatory
tests/test_disconnect_inproc
tests/test_unbind_inproc
tests/test_unbind_wildcard
tests/test*.log
tests/test*.trs
src/platform.hpp*

2
NEWS
View File

@ -1,6 +1,8 @@
0MQ version 3.2.6 stable, released on 2015/xx/xx
================================================
* LIBZMQ-949 zmq_unbind fails for inproc and wildcard endpoints
0MQ version 3.2.5 stable, released on 2014/10/14
================================================

View File

@ -303,6 +303,26 @@ int zmq::ctx_t::register_endpoint (const char *addr_, endpoint_t &endpoint_)
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_)
{
endpoints_sync.lock ();

View File

@ -92,6 +92,7 @@ namespace zmq
// Management of inproc endpoints.
int register_endpoint (const char *addr_, endpoint_t &endpoint_);
int unregister_endpoint (const std::string &addr_, socket_base_t *socket_);
void unregister_endpoints (zmq::socket_base_t *socket_);
endpoint_t find_endpoint (const char *addr_);

View File

@ -134,6 +134,12 @@ int zmq::object_t::register_endpoint (const char *addr_, endpoint_t &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_)
{
return ctx->unregister_endpoints (socket_);

View File

@ -22,6 +22,7 @@
#ifndef __ZMQ_OBJECT_HPP_INCLUDED__
#define __ZMQ_OBJECT_HPP_INCLUDED__
#include <string>
#include "stdint.hpp"
namespace zmq
@ -57,6 +58,8 @@ namespace zmq
// Using following function, socket is able to access global
// repository of inproc endpoints.
int register_endpoint (const char *addr_, zmq::endpoint_t &endpoint_);
int unregister_endpoint (
const std::string &addr_, socket_base_t *socket_);
void unregister_endpoints (zmq::socket_base_t *socket_);
zmq::endpoint_t find_endpoint (const char *addr_);
void destroy_socket (zmq::socket_base_t *socket_);

View File

@ -364,7 +364,7 @@ int zmq::socket_base_t::bind (const char *addr_)
// Save last endpoint URI
listener->get_address (options.last_endpoint);
add_endpoint (addr_, (own_t *) listener);
add_endpoint (options.last_endpoint.c_str (), (own_t *) listener);
return 0;
}
@ -383,7 +383,7 @@ int zmq::socket_base_t::bind (const char *addr_)
// Save last endpoint URI
listener->get_address (options.last_endpoint);
add_endpoint (addr_, (own_t *) listener);
add_endpoint (options.last_endpoint.c_str (), (own_t *) listener);
return 0;
}
#endif
@ -600,6 +600,8 @@ int zmq::socket_base_t::term_endpoint (const char *addr_)
// Disconnect an inproc socket
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_));
if (range.first == range.second) {
errno = ENOENT;

View File

@ -18,7 +18,9 @@ noinst_PROGRAMS = test_pair_inproc \
test_term_endpoint \
test_monitor \
test_router_mandatory \
test_disconnect_inproc
test_disconnect_inproc \
test_unbind_inproc \
test_unbind_wildcard
if !ON_MINGW
@ -43,6 +45,8 @@ test_last_endpoint_SOURCES = test_last_endpoint.cpp
test_term_endpoint_SOURCES = test_term_endpoint.cpp
test_monitor_SOURCES = test_monitor.cpp
test_disconnect_inproc_SOURCES = test_disconnect_inproc.cpp
test_unbind_inproc_SOURCES = test_unbind_inproc.cpp
test_unbind_wildcard_SOURCES = test_unbind_wildcard.cpp
test_router_mandatory_SOURCES = test_router_mandatory.cpp
if !ON_MINGW

View File

@ -0,0 +1,42 @@
/*
Copyright (c) 2007-2013 Contributors as noted in the AUTHORS file
This file is part of 0MQ.
0MQ is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
0MQ is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "testutil.hpp"
int main (void)
{
void *ctx = zmq_ctx_new ();
assert (ctx);
void *sb = zmq_socket (ctx, ZMQ_REP);
assert (sb);
int rc = zmq_bind (sb, "inproc://a");
assert (rc == 0);
rc = zmq_unbind (sb, "inproc://a");
assert (rc == 0);
rc = zmq_close (sb);
assert (rc == 0);
rc = zmq_ctx_destroy (ctx);
assert (rc == 0);
return 0;
}

View File

@ -0,0 +1,47 @@
/*
Copyright (c) 2007-2013 Contributors as noted in the AUTHORS file
This file is part of 0MQ.
0MQ is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
0MQ is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "testutil.hpp"
int main (void)
{
void *ctx = zmq_ctx_new ();
assert (ctx);
void *sb = zmq_socket (ctx, ZMQ_REP);
assert (sb);
int rc = zmq_bind (sb, "tcp://*:5555");
assert (rc == 0);
char endpoint[256];
size_t endpoint_len = sizeof (endpoint);
rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, endpoint, &endpoint_len);
assert (rc == 0);
rc = zmq_unbind (sb, endpoint);
assert (rc == 0);
rc = zmq_close (sb);
assert (rc == 0);
rc = zmq_ctx_destroy (ctx);
assert (rc == 0);
return 0;
}