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:
commit
b56cb96783
2
.gitignore
vendored
2
.gitignore
vendored
@ -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
2
NEWS
@ -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
|
||||
================================================
|
||||
|
20
src/ctx.cpp
20
src/ctx.cpp
@ -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 ();
|
||||
|
@ -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_);
|
||||
|
||||
|
@ -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_);
|
||||
|
@ -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_);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
42
tests/test_unbind_inproc.cpp
Normal file
42
tests/test_unbind_inproc.cpp
Normal 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;
|
||||
}
|
47
tests/test_unbind_wildcard.cpp
Normal file
47
tests/test_unbind_wildcard.cpp
Normal 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user