Repository: qpid-proton Updated Branches: refs/heads/master b005b877a -> 03b4ac609
PROTON-1236: add a link to the transport's reactor as soon as the it is bound Previously the reactor would be put on the transport's attachment list when a socket selector was created for the transport. If the socket setup fails then no selector is created and the reactor is never added to the transport. This would result in a crash as the code depends on the reactor being present in the transport when transport events are generated. Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/03b4ac60 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/03b4ac60 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/03b4ac60 Branch: refs/heads/master Commit: 03b4ac60932110ffe0352195add7667dc11a2875 Parents: b005b87 Author: Ken Giusti <[email protected]> Authored: Sat Jun 11 13:42:33 2016 -0400 Committer: Ken Giusti <[email protected]> Committed: Thu Jun 16 08:42:39 2016 -0400 ---------------------------------------------------------------------- proton-c/src/reactor/connection.c | 4 +++- proton-c/src/tests/reactor.c | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/03b4ac60/proton-c/src/reactor/connection.c ---------------------------------------------------------------------- diff --git a/proton-c/src/reactor/connection.c b/proton-c/src/reactor/connection.c index 422a072..d73e386 100644 --- a/proton-c/src/reactor/connection.c +++ b/proton-c/src/reactor/connection.c @@ -134,6 +134,9 @@ void pni_handle_bound(pn_reactor_t *reactor, pn_event_t *event) { const char *port = "5672"; pn_string_t *str = NULL; + // link the new transport to its reactor: + pni_record_init_reactor(pn_transport_attachments(transport), reactor); + if (pn_connection_acceptor(conn) != NULL) { // this connection was created by the acceptor. There is already a // socket assigned to this connection. Nothing needs to be done. @@ -310,7 +313,6 @@ pn_selectable_t *pn_reactor_selectable_transport(pn_reactor_t *reactor, pn_socke pn_record_t *tr = pn_transport_attachments(transport); pn_record_def(tr, PN_TRANCTX, PN_WEAKREF); pn_record_set(tr, PN_TRANCTX, sel); - pni_record_init_reactor(tr, reactor); pni_connection_update(sel); pn_reactor_update(reactor, sel); return sel; http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/03b4ac60/proton-c/src/tests/reactor.c ---------------------------------------------------------------------- diff --git a/proton-c/src/tests/reactor.c b/proton-c/src/tests/reactor.c index 427ffb5..900d6a3 100644 --- a/proton-c/src/tests/reactor.c +++ b/proton-c/src/tests/reactor.c @@ -372,6 +372,27 @@ static void test_reactor_connect(void) { pn_reactor_free(reactor); } +static void test_reactor_bad_domain(void) { + pn_reactor_t *reactor = pn_reactor(); + assert(reactor); + pn_handler_t *ch = pn_handler_new(client_dispatch, sizeof(client_t), NULL); + client_t *cli = cmem(ch); + cli->events = pn_list(PN_VOID, 0); + pn_connection_t *connection = pn_reactor_connection_to_host(reactor, "somebogusdomain", "5672", ch); + assert(connection); + pn_reactor_run(reactor); + + expect(cli->events, PN_CONNECTION_INIT, PN_CONNECTION_LOCAL_OPEN, + PN_CONNECTION_BOUND, PN_TRANSPORT_TAIL_CLOSED, + PN_TRANSPORT_ERROR, PN_TRANSPORT_HEAD_CLOSED, + PN_TRANSPORT_CLOSED, PN_CONNECTION_UNBOUND, + END); + + pn_free(cli->events); + pn_decref(ch); + pn_reactor_free(reactor); +} + typedef struct { int received; } sink_t; @@ -541,6 +562,7 @@ int main(int argc, char **argv) test_reactor_handler_run_free(); test_reactor_connection(); test_reactor_connection_factory(); + test_reactor_bad_domain(); test_reactor_acceptor(); test_reactor_acceptor_run(); test_reactor_connect(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
