mirror of
https://github.com/zeromq/libzmq.git
synced 2024-12-26 23:01:04 +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_term_endpoint
|
||||||
tests/test_router_mandatory
|
tests/test_router_mandatory
|
||||||
tests/test_disconnect_inproc
|
tests/test_disconnect_inproc
|
||||||
|
tests/test_unbind_inproc
|
||||||
|
tests/test_unbind_wildcard
|
||||||
tests/test*.log
|
tests/test*.log
|
||||||
tests/test*.trs
|
tests/test*.trs
|
||||||
src/platform.hpp*
|
src/platform.hpp*
|
||||||
|
2
NEWS
2
NEWS
@ -1,6 +1,8 @@
|
|||||||
0MQ version 3.2.6 stable, released on 2015/xx/xx
|
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
|
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;
|
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 ();
|
||||||
|
@ -92,6 +92,7 @@ namespace zmq
|
|||||||
|
|
||||||
// Management of inproc endpoints.
|
// Management of inproc endpoints.
|
||||||
int register_endpoint (const char *addr_, endpoint_t &endpoint_);
|
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_);
|
void unregister_endpoints (zmq::socket_base_t *socket_);
|
||||||
endpoint_t find_endpoint (const char *addr_);
|
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_);
|
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_);
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#ifndef __ZMQ_OBJECT_HPP_INCLUDED__
|
#ifndef __ZMQ_OBJECT_HPP_INCLUDED__
|
||||||
#define __ZMQ_OBJECT_HPP_INCLUDED__
|
#define __ZMQ_OBJECT_HPP_INCLUDED__
|
||||||
|
|
||||||
|
#include <string>
|
||||||
#include "stdint.hpp"
|
#include "stdint.hpp"
|
||||||
|
|
||||||
namespace zmq
|
namespace zmq
|
||||||
@ -57,6 +58,8 @@ namespace zmq
|
|||||||
// Using following function, socket is able to access global
|
// Using following function, socket is able to access global
|
||||||
// repository of inproc endpoints.
|
// repository of inproc endpoints.
|
||||||
int register_endpoint (const char *addr_, zmq::endpoint_t &endpoint_);
|
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_);
|
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 destroy_socket (zmq::socket_base_t *socket_);
|
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
|
// Save last endpoint URI
|
||||||
listener->get_address (options.last_endpoint);
|
listener->get_address (options.last_endpoint);
|
||||||
|
|
||||||
add_endpoint (addr_, (own_t *) listener);
|
add_endpoint (options.last_endpoint.c_str (), (own_t *) listener);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -383,7 +383,7 @@ int zmq::socket_base_t::bind (const char *addr_)
|
|||||||
// Save last endpoint URI
|
// Save last endpoint URI
|
||||||
listener->get_address (options.last_endpoint);
|
listener->get_address (options.last_endpoint);
|
||||||
|
|
||||||
add_endpoint (addr_, (own_t *) listener);
|
add_endpoint (options.last_endpoint.c_str (), (own_t *) listener);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -600,6 +600,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;
|
||||||
|
@ -18,7 +18,9 @@ noinst_PROGRAMS = test_pair_inproc \
|
|||||||
test_term_endpoint \
|
test_term_endpoint \
|
||||||
test_monitor \
|
test_monitor \
|
||||||
test_router_mandatory \
|
test_router_mandatory \
|
||||||
test_disconnect_inproc
|
test_disconnect_inproc \
|
||||||
|
test_unbind_inproc \
|
||||||
|
test_unbind_wildcard
|
||||||
|
|
||||||
|
|
||||||
if !ON_MINGW
|
if !ON_MINGW
|
||||||
@ -43,6 +45,8 @@ test_last_endpoint_SOURCES = test_last_endpoint.cpp
|
|||||||
test_term_endpoint_SOURCES = test_term_endpoint.cpp
|
test_term_endpoint_SOURCES = test_term_endpoint.cpp
|
||||||
test_monitor_SOURCES = test_monitor.cpp
|
test_monitor_SOURCES = test_monitor.cpp
|
||||||
test_disconnect_inproc_SOURCES = test_disconnect_inproc.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
|
test_router_mandatory_SOURCES = test_router_mandatory.cpp
|
||||||
|
|
||||||
if !ON_MINGW
|
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