From 1d033484ee1a2ec26d3eead073e7bc0f889ffdf4 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Tue, 15 May 2018 01:47:12 -0700 Subject: fixes #419 want to nni_aio_stop without blocking (#428) * fixes #419 want to nni_aio_stop without blocking This actually introduces an nni_aio_close() API that causes nni_aio_begin to return NNG_ECLOSED, while scheduling a callback on the AIO to do an NNG_ECLOSED as well. This should be called in non-blocking close() contexts instead of nni_aio_stop(), and the cases where we call nni_aio_fini() multiple times are updated updated to add nni_aio_stop() calls on all "interlinked" aios before finalizing them. Furthermore, we call nni_aio_close() as soon as practical in the close path. This closes an annoying race condition where the callback from a lower subsystem could wind up rescheduling an operation that we wanted to abort. --- src/core/transport.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/core/transport.h') diff --git a/src/core/transport.h b/src/core/transport.h index b1fecaa2..96976efd 100644 --- a/src/core/transport.h +++ b/src/core/transport.h @@ -23,10 +23,10 @@ struct nni_tran { const char *tran_scheme; // tran_ep links our endpoint-specific operations. - const nni_tran_ep *tran_ep; + const nni_tran_ep_ops *tran_ep; // tran_pipe links our pipe-specific operations. - const nni_tran_pipe *tran_pipe; + const nni_tran_pipe_ops *tran_pipe; // tran_init, if not NULL, is called once during library // initialization. @@ -77,7 +77,7 @@ struct nni_tran_ep_option { // For a given endpoint, the framework holds a lock so that each entry // point is run exclusively of the others. (Transports must still guard // against any asynchronous operations they manage themselves, though.) -struct nni_tran_ep { +struct nni_tran_ep_ops { // ep_init creates a vanilla endpoint. The value created is // used for the first argument for all other endpoint functions. int (*ep_init)(void **, nni_url *, nni_sock *, int); @@ -128,7 +128,7 @@ struct nni_tran_pipe_option { // with socket locks held, so it is forbidden for the transport to call // back into the socket at this point. (Which is one reason pointers back // to socket or even enclosing pipe state, are not provided.) -struct nni_tran_pipe { +struct nni_tran_pipe_ops { // p_fini destroys the pipe. This should clean up all local // resources, including closing files and freeing memory, used by // the pipe. After this call returns, the system will not make -- cgit v1.2.3-70-g09d2