From 251553b13e6bc8019914b9edd1292f97e856dd43 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Tue, 26 Jun 2018 17:39:17 -0700 Subject: fixes #522 Separate out the endpoint plumbing This separates the plumbing for endpoints into distinct dialer and listeners. Some of the transports could benefit from further separation, but we've done some rather larger separation e.g. for the websocket transport. IPC would be a good one to update later, when we start looking at exposing a more natural underlying API. --- src/nng.c | 265 +++++++++++++++++++++++++++++++------------------------------- 1 file changed, 132 insertions(+), 133 deletions(-) (limited to 'src/nng.c') diff --git a/src/nng.c b/src/nng.c index acdabe69..f7f16954 100644 --- a/src/nng.c +++ b/src/nng.c @@ -316,7 +316,7 @@ nng_ctx_send(nng_ctx cid, nng_aio *aio) } static int -nng_ctx_getx(nng_ctx id, const char *n, void *v, size_t *szp, int t) +nng_ctx_getx(nng_ctx id, const char *n, void *v, size_t *szp, nni_opt_type t) { nni_ctx *ctx; int rv; @@ -367,7 +367,8 @@ nng_ctx_getopt_ms(nng_ctx id, const char *name, nng_duration *vp) } static int -nng_ctx_setx(nng_ctx id, const char *n, const void *v, size_t sz, int t) +nng_ctx_setx( + nng_ctx id, const char *n, const void *v, size_t sz, nni_opt_type t) { nni_ctx *ctx; int rv; @@ -414,97 +415,97 @@ nng_ctx_setopt_ms(nng_ctx id, const char *name, nng_duration v) } int -nng_dial(nng_socket s, const char *addr, nng_dialer *dp, int flags) +nng_dial(nng_socket sid, const char *addr, nng_dialer *dp, int flags) { - nni_ep * ep; - int rv; - nni_sock *sock; + nni_dialer *d; + int rv; + nni_sock * s; - if ((rv = nni_sock_find(&sock, s.id)) != 0) { + if ((rv = nni_sock_find(&s, sid.id)) != 0) { return (rv); } - if ((rv = nni_ep_create_dialer(&ep, sock, addr)) != 0) { - nni_sock_rele(sock); + if ((rv = nni_dialer_create(&d, s, addr)) != 0) { + nni_sock_rele(s); return (rv); } - if ((rv = nni_ep_dial(ep, flags)) != 0) { - nni_ep_close(ep); - nni_sock_rele(sock); + if ((rv = nni_dialer_start(d, flags)) != 0) { + nni_dialer_close(d); + nni_sock_rele(s); return (rv); } if (dp != NULL) { - nng_dialer d; - d.id = nni_ep_id(ep); - *dp = d; + nng_dialer did; + did.id = nni_dialer_id(d); + *dp = did; } - nni_ep_rele(ep); - nni_sock_rele(sock); + nni_dialer_rele(d); + nni_sock_rele(s); return (0); } int -nng_listen(nng_socket s, const char *addr, nng_listener *lp, int flags) +nng_listen(nng_socket sid, const char *addr, nng_listener *lp, int flags) { - nni_ep * ep; - int rv; - nni_sock *sock; + int rv; + nni_sock * s; + nni_listener *l; - if ((rv = nni_sock_find(&sock, s.id)) != 0) { + if ((rv = nni_sock_find(&s, sid.id)) != 0) { return (rv); } - if ((rv = nni_ep_create_listener(&ep, sock, addr)) != 0) { - nni_sock_rele(sock); + if ((rv = nni_listener_create(&l, s, addr)) != 0) { + nni_sock_rele(s); return (rv); } - if ((rv = nni_ep_listen(ep, flags)) != 0) { - nni_ep_close(ep); - nni_sock_rele(sock); + if ((rv = nni_listener_start(l, flags)) != 0) { + nni_listener_close(l); + nni_sock_rele(s); return (rv); } if (lp != NULL) { - nng_listener l; - l.id = nni_ep_id(ep); - *lp = l; + nng_listener lid; + lid.id = nni_listener_id(l); + *lp = lid; } - nni_ep_rele(ep); - nni_sock_rele(sock); + nni_listener_rele(l); + nni_sock_rele(s); return (rv); } int -nng_listener_create(nng_listener *lp, nng_socket s, const char *addr) +nng_listener_create(nng_listener *lp, nng_socket sid, const char *addr) { - nni_sock * sock; - nni_ep * ep; - int rv; - nng_listener l; + nni_sock * s; + int rv; + nni_listener *l; + nng_listener lid; - if ((rv = nni_sock_find(&sock, s.id)) != 0) { + if ((rv = nni_sock_find(&s, sid.id)) != 0) { return (rv); } - if ((rv = nni_ep_create_listener(&ep, sock, addr)) != 0) { - nni_sock_rele(sock); + if ((rv = nni_listener_create(&l, s, addr)) != 0) { + nni_sock_rele(s); return (rv); } - l.id = nni_ep_id(ep); - *lp = l; - nni_ep_rele(ep); - nni_sock_rele(sock); + lid.id = nni_listener_id(l); + *lp = lid; + nni_listener_rele(l); + nni_sock_rele(s); return (0); } int -nng_listener_start(nng_listener l, int flags) +nng_listener_start(nng_listener lid, int flags) { - nni_ep *ep; - int rv; + nni_listener *l; + int rv; - if ((rv = nni_ep_find(&ep, l.id)) != 0) { + if ((rv = nni_listener_find(&l, lid.id)) != 0) { return (rv); } - rv = nni_ep_listen(ep, flags); - nni_ep_rele(ep); + rv = nni_listener_start(l, flags); + nni_listener_rele(l); return (rv); } @@ -515,38 +516,38 @@ nng_listener_id(nng_listener l) } int -nng_dialer_create(nng_dialer *dp, nng_socket s, const char *addr) +nng_dialer_create(nng_dialer *dp, nng_socket sid, const char *addr) { - nni_sock * sock; - nni_ep * ep; - int rv; - nng_dialer d; + nni_sock * s; + nni_dialer *d; + int rv; + nng_dialer did; - if ((rv = nni_sock_find(&sock, s.id)) != 0) { + if ((rv = nni_sock_find(&s, sid.id)) != 0) { return (rv); } - if ((rv = nni_ep_create_dialer(&ep, sock, addr)) != 0) { - nni_sock_rele(sock); + if ((rv = nni_dialer_create(&d, s, addr)) != 0) { + nni_sock_rele(s); return (rv); } - d.id = nni_ep_id(ep); - *dp = d; - nni_ep_rele(ep); - nni_sock_rele(sock); + did.id = nni_dialer_id(d); + *dp = did; + nni_dialer_rele(d); + nni_sock_rele(s); return (0); } int -nng_dialer_start(nng_dialer d, int flags) +nng_dialer_start(nng_dialer did, int flags) { - nni_ep *ep; - int rv; + nni_dialer *d; + int rv; - if ((rv = nni_ep_find(&ep, d.id)) != 0) { + if ((rv = nni_dialer_find(&d, did.id)) != 0) { return (rv); } - rv = nni_ep_dial(ep, flags); - nni_ep_rele(ep); + rv = nni_dialer_start(d, flags); + nni_dialer_rele(d); return (rv); } @@ -557,54 +558,41 @@ nng_dialer_id(nng_dialer d) } static int -nng_ep_setx( - uint32_t id, const char *n, const void *v, size_t sz, int mode, int t) +nng_dialer_setx( + nng_dialer did, const char *n, const void *v, size_t sz, nni_opt_type t) { - nni_ep *ep; - int rv; + nni_dialer *d; + int rv; if ((rv = nni_init()) != 0) { return (rv); } - if ((rv = nni_ep_find(&ep, id)) != 0) { + if ((rv = nni_dialer_find(&d, did.id)) != 0) { return (rv); } - if (nni_ep_mode(ep) == mode) { - rv = nni_ep_setopt(ep, n, v, sz, t); - } else { - rv = NNG_ENOENT; - } - nni_ep_rele(ep); + rv = nni_dialer_setopt(d, n, v, sz, t); + nni_dialer_rele(d); return (rv); } static int -nng_ep_getx(uint32_t id, const char *n, void *v, size_t *szp, int mode, int t) +nng_dialer_getx( + nng_dialer did, const char *n, void *v, size_t *szp, nni_opt_type t) { - nni_ep *ep; - int rv; + nni_dialer *d; + int rv; if ((rv = nni_init()) != 0) { return (rv); } - if ((rv = nni_ep_find(&ep, id)) != 0) { + if ((rv = nni_dialer_find(&d, did.id)) != 0) { return (rv); } - if (nni_ep_mode(ep) == mode) { - rv = nni_ep_getopt(ep, n, v, szp, t); - } else { - rv = NNG_ENOENT; - } - nni_ep_rele(ep); + rv = nni_dialer_getopt(d, n, v, szp, t); + nni_dialer_rele(d); return (rv); } -static int -nng_dialer_setx(nng_dialer d, const char *nm, const void *v, size_t sz, int t) -{ - return (nng_ep_setx(d.id, nm, v, sz, NNI_EP_MODE_DIAL, t)); -} - int nng_dialer_setopt(nng_dialer d, const char *name, const void *v, size_t sz) { @@ -653,12 +641,6 @@ nng_dialer_setopt_string(nng_dialer d, const char *name, const char *v) return (nng_dialer_setx(d, name, v, strlen(v) + 1, NNI_TYPE_STRING)); } -static int -nng_dialer_getx(nng_dialer d, const char *n, void *v, size_t *szp, int t) -{ - return (nng_ep_getx(d.id, n, v, szp, NNI_EP_MODE_DIAL, t)); -} - int nng_dialer_getopt(nng_dialer d, const char *name, void *val, size_t *szp) { @@ -722,10 +704,21 @@ nng_dialer_getopt_ms(nng_dialer d, const char *name, nng_duration *vp) } int -nng_listener_setx( - nng_listener l, const char *name, const void *v, size_t sz, int t) +nng_listener_setx(nng_listener lid, const char *name, const void *v, size_t sz, + nni_opt_type t) { - return (nng_ep_setx(l.id, name, v, sz, NNI_EP_MODE_LISTEN, t)); + nni_listener *l; + int rv; + + if ((rv = nni_init()) != 0) { + return (rv); + } + if ((rv = nni_listener_find(&l, lid.id)) != 0) { + return (rv); + } + rv = nni_listener_setopt(l, name, v, sz, t); + nni_listener_rele(l); + return (rv); } int @@ -778,9 +771,20 @@ nng_listener_setopt_string(nng_listener l, const char *n, const char *v) int nng_listener_getx( - nng_listener l, const char *name, void *v, size_t *szp, int t) + nng_listener lid, const char *name, void *v, size_t *szp, nni_opt_type t) { - return (nng_ep_getx(l.id, name, v, szp, NNI_EP_MODE_LISTEN, t)); + nni_listener *l; + int rv; + + if ((rv = nni_init()) != 0) { + return (rv); + } + if ((rv = nni_listener_find(&l, lid.id)) != 0) { + return (rv); + } + rv = nni_listener_getopt(l, name, v, szp, t); + nni_listener_rele(l); + return (rv); } int @@ -846,38 +850,35 @@ nng_listener_getopt_ms(nng_listener l, const char *name, nng_duration *vp) return (nng_listener_getx(l, name, vp, &sz, NNI_TYPE_DURATION)); } -static int -nng_ep_close(uint32_t id, int mode) +int +nng_dialer_close(nng_dialer did) { - nni_ep *ep; - int rv; + nni_dialer *d; + int rv; - if ((rv = nni_ep_find(&ep, id)) != 0) { + if ((rv = nni_dialer_find(&d, did.id)) != 0) { return (rv); } - if (nni_ep_mode(ep) != mode) { - nni_ep_rele(ep); - return (NNG_ENOENT); - } - - nni_ep_close(ep); + nni_dialer_close(d); return (0); } int -nng_dialer_close(nng_dialer d) +nng_listener_close(nng_listener lid) { - return (nng_ep_close(d.id, NNI_EP_MODE_DIAL)); -} + nni_listener *l; + int rv; -int -nng_listener_close(nng_listener l) -{ - return (nng_ep_close(l.id, NNI_EP_MODE_LISTEN)); + if ((rv = nni_listener_find(&l, lid.id)) != 0) { + return (rv); + } + nni_listener_close(l); + return (0); } static int -nng_setx(nng_socket s, const char *name, const void *val, size_t sz, int t) +nng_setx( + nng_socket s, const char *name, const void *val, size_t sz, nni_opt_type t) { nni_sock *sock; int rv; @@ -900,7 +901,8 @@ nng_setopt(nng_socket s, const char *name, const void *val, size_t sz) } static int -nng_getx(nng_socket s, const char *name, void *val, size_t *szp, int t) +nng_getx( + nng_socket s, const char *name, void *val, size_t *szp, nni_opt_type t) { nni_sock *sock; int rv; @@ -1130,7 +1132,8 @@ nng_strerror(int num) } static int -nng_pipe_getx(nng_pipe p, const char *name, void *val, size_t *szp, int t) +nng_pipe_getx( + nng_pipe p, const char *name, void *val, size_t *szp, nni_opt_type t) { int rv; nni_pipe *pipe; @@ -1227,9 +1230,7 @@ nng_pipe_dialer(nng_pipe p) nng_dialer d = NNG_DIALER_INITIALIZER; nni_pipe * pipe; if ((nni_init() == 0) && (nni_pipe_find(&pipe, p.id) == 0)) { - if (nni_pipe_ep_mode(pipe) == NNI_EP_MODE_DIAL) { - d.id = nni_pipe_ep_id(pipe); - } + d.id = nni_pipe_dialer_id(pipe); nni_pipe_rele(pipe); } return (d); @@ -1241,9 +1242,7 @@ nng_pipe_listener(nng_pipe p) nng_listener l = NNG_LISTENER_INITIALIZER; nni_pipe * pipe; if ((nni_init() == 0) && (nni_pipe_find(&pipe, p.id) == 0)) { - if (nni_pipe_ep_mode(pipe) == NNI_EP_MODE_LISTEN) { - l.id = nni_pipe_ep_id(pipe); - } + l.id = nni_pipe_listener_id(pipe); nni_pipe_rele(pipe); } return (l); -- cgit v1.2.3-70-g09d2