Skip to content

Commit

Permalink
Merge pull request #128 from calid/libzmq-949-backport
Browse files Browse the repository at this point in the history
backport #949 fixes to 4-x stable
  • Loading branch information
hintjens committed Jun 29, 2015
2 parents 190e737 + d2574dd commit 42007dd
Show file tree
Hide file tree
Showing 9 changed files with 131 additions and 2 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ tests/test_immediate
tests/test_term_endpoint
tests/test_router_mandatory
tests/test_disconnect_inproc
tests/test_unbind_inproc
tests/test_unbind_wildcard
tests/test_raw_sock
tests/test_disconnect_inproc
tests/test_ctx_options
Expand Down
20 changes: 20 additions & 0 deletions src/ctx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,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 ();
Expand Down
1 change: 1 addition & 0 deletions src/ctx.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,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_);
void pend_connection (const char *addr_, pending_connection_t &pending_connection_);
Expand Down
6 changes: 6 additions & 0 deletions src/object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,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_);
Expand Down
3 changes: 3 additions & 0 deletions src/object.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#ifndef __ZMQ_OBJECT_HPP_INCLUDED__
#define __ZMQ_OBJECT_HPP_INCLUDED__

#include <string>
#include "stdint.hpp"

namespace zmq
Expand Down Expand Up @@ -59,6 +60,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 pend_connection (const char *addr_, pending_connection_t &pending_connection_);
Expand Down
6 changes: 4 additions & 2 deletions src/socket_base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ int zmq::socket_base_t::bind (const char *addr_)
// Save last endpoint URI
listener->get_address (last_endpoint);

add_endpoint (addr_, (own_t *) listener, NULL);
add_endpoint (last_endpoint.c_str (), (own_t *) listener, NULL);
return 0;
}

Expand All @@ -397,7 +397,7 @@ int zmq::socket_base_t::bind (const char *addr_)
// Save last endpoint URI
listener->get_address (last_endpoint);

add_endpoint (addr_, (own_t *) listener, NULL);
add_endpoint (last_endpoint.c_str (), (own_t *) listener, NULL);
return 0;
}
#endif
Expand Down Expand Up @@ -657,6 +657,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;
Expand Down
4 changes: 4 additions & 0 deletions tests/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ noinst_PROGRAMS = test_system \
test_probe_router \
test_stream \
test_disconnect_inproc \
test_unbind_inproc \
test_unbind_wildcard \
test_ctx_options \
test_ctx_destroy \
test_security_null \
Expand Down Expand Up @@ -72,6 +74,8 @@ test_router_raw_empty_SOURCES = test_router_raw_empty.cpp
test_probe_router_SOURCES = test_probe_router.cpp
test_stream_SOURCES = test_stream.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_ctx_options_SOURCES = test_ctx_options.cpp
test_iov_SOURCES = test_iov.cpp
test_ctx_destroy_SOURCES = test_ctx_destroy.cpp
Expand Down
43 changes: 43 additions & 0 deletions tests/test_unbind_inproc.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
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)
{
setup_test_environment();
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_term (ctx);
assert (rc == 0);

return 0;
}
48 changes: 48 additions & 0 deletions tests/test_unbind_wildcard.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
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)
{
setup_test_environment();
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_term (ctx);
assert (rc == 0);

return 0;
}

0 comments on commit 42007dd

Please sign in to comment.