From c1a92ee76a3e9e70ecae4646763bade0c16e4807 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Mon, 3 Jul 2017 12:44:02 -0700 Subject: inproc transport uses aio for connect/accept. --- src/core/endpt.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 4 deletions(-) (limited to 'src/core/endpt.c') diff --git a/src/core/endpt.c b/src/core/endpt.c index b24d7643..20874c90 100644 --- a/src/core/endpt.c +++ b/src/core/endpt.c @@ -236,16 +236,41 @@ nni_ep_remove(nni_ep *ep) } +static int +nni_ep_connect_aio(nni_ep *ep, void **pipep) +{ + nni_aio aio; + int rv; + + nni_aio_init(&aio, NULL, NULL); + aio.a_endpt = ep->ep_data; + ep->ep_ops.ep_connect(ep->ep_data, &aio); + nni_aio_wait(&aio); + + if ((rv = nni_aio_result(&aio)) == 0) { + *pipep = aio.a_pipe; + } + nni_aio_fini(&aio); + return (rv); +} + + static int nni_ep_connect_sync(nni_ep *ep) { nni_pipe *pipe; int rv; - if ((rv = nni_pipe_create(&pipe, ep, ep->ep_sock, ep->ep_tran)) != 0) { + rv = nni_pipe_create(&pipe, ep, ep->ep_sock, ep->ep_tran); + if (rv != 0) { return (rv); } - rv = ep->ep_ops.ep_connect_sync(ep->ep_data, &pipe->p_tran_data); + if (ep->ep_ops.ep_connect != NULL) { + rv = nni_ep_connect_aio(ep, &pipe->p_tran_data); + } else { + rv = ep->ep_ops.ep_connect_sync(ep->ep_data, + &pipe->p_tran_data); + } if (rv != 0) { nni_pipe_remove(pipe); return (rv); @@ -399,6 +424,25 @@ nni_ep_dial(nni_ep *ep, int flags) } +static int +nni_ep_accept_aio(nni_ep *ep, void **pipep) +{ + nni_aio aio; + int rv; + + nni_aio_init(&aio, NULL, NULL); + aio.a_endpt = ep->ep_data; + ep->ep_ops.ep_accept(ep->ep_data, &aio); + nni_aio_wait(&aio); + + if ((rv = nni_aio_result(&aio)) == 0) { + *pipep = aio.a_pipe; + } + nni_aio_fini(&aio); + return (rv); +} + + static int nni_ep_accept_sync(nni_ep *ep) { @@ -408,10 +452,16 @@ nni_ep_accept_sync(nni_ep *ep) if (ep->ep_closed) { return (NNG_ECLOSED); } - if ((rv = nni_pipe_create(&pipe, ep, ep->ep_sock, ep->ep_tran)) != 0) { + rv = nni_pipe_create(&pipe, ep, ep->ep_sock, ep->ep_tran); + if (rv != 0) { return (rv); } - rv = ep->ep_ops.ep_accept_sync(ep->ep_data, &pipe->p_tran_data); + if (ep->ep_ops.ep_accept != NULL) { + rv = nni_ep_accept_aio(ep, &pipe->p_tran_data); + } else { + rv = ep->ep_ops.ep_accept_sync(ep->ep_data, + &pipe->p_tran_data); + } if (rv != 0) { nni_pipe_remove(pipe); return (rv); -- cgit v1.2.3-70-g09d2