From a7a3046f7cca833e895d58976843663d1df5caba Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Sun, 8 Dec 2024 20:38:38 -0800 Subject: endpoints: add transport ep stop functions This should allow us to stop the endpoints early, without freeing them. This ensures that pipe creation has ended before we start tearing down pipes. --- src/core/dialer.c | 5 ++++- src/core/listener.c | 5 ++++- src/sp/transport.h | 18 ++++++++++++------ 3 files changed, 20 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/core/dialer.c b/src/core/dialer.c index 388d9981..6224ce9b 100644 --- a/src/core/dialer.c +++ b/src/core/dialer.c @@ -541,9 +541,12 @@ nni_dialer_start(nni_dialer *d, unsigned flags) void nni_dialer_stop(nni_dialer *d) { + d->d_ops.d_close(d->d_data); nni_aio_stop(&d->d_tmo_aio); nni_aio_stop(&d->d_con_aio); - d->d_ops.d_close(d->d_data); + if (d->d_ops.d_stop) { + d->d_ops.d_stop(d->d_data); + } } nni_sock * diff --git a/src/core/listener.c b/src/core/listener.c index 3dc2a0fa..1eeaa3cd 100644 --- a/src/core/listener.c +++ b/src/core/listener.c @@ -524,9 +524,12 @@ nni_listener_start(nni_listener *l, int flags) void nni_listener_stop(nni_listener *l) { + l->l_ops.l_close(l->l_data); nni_aio_stop(&l->l_tmo_aio); nni_aio_stop(&l->l_acc_aio); - l->l_ops.l_close(l->l_data); + if (l->l_ops.l_stop) { + l->l_ops.l_stop(l->l_data); + } } nni_sock * diff --git a/src/sp/transport.h b/src/sp/transport.h index 10207f28..6d1e0d4a 100644 --- a/src/sp/transport.h +++ b/src/sp/transport.h @@ -43,11 +43,14 @@ struct nni_sp_dialer_ops { // NNG_ECONNFAILED, NNG_ETIMEDOUT, and NNG_EPROTO. void (*d_connect)(void *, nni_aio *); - // d_close stops the dialer from operating altogether. It - // does not affect pipes that have already been created. It is - // nonblocking. + // d_close stops the dialer from operating altogether. + // It is nonblocking. void (*d_close)(void *); + // d_stop is close, but also waits for the operation to be + // be fully stopped. + void (*d_stop)(void *); + // d_getopt is used to obtain an option. int (*d_getopt)(void *, const char *, void *, size_t *, nni_type); @@ -93,11 +96,14 @@ struct nni_sp_listener_ops { // l_accept accepts an inbound connection. void (*l_accept)(void *, nni_aio *); - // l_close stops the listener from operating altogether. It - // does not affect pipes that have already been created. It is - // nonblocking. + // l_close stops the listener from operating altogether. + // It is nonblocking. void (*l_close)(void *); + // l_stop is close, but also waits for the operation to be + // be fully stopped. + void (*l_stop)(void *); + // l_getopt is used to obtain an option. int (*l_getopt)(void *, const char *, void *, size_t *, nni_type); -- cgit v1.2.3-70-g09d2