aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sp/transport/tls/tls.c41
-rw-r--r--src/supplemental/tls/tls_common.c54
2 files changed, 33 insertions, 62 deletions
diff --git a/src/sp/transport/tls/tls.c b/src/sp/transport/tls/tls.c
index 9a216f2b..db301af3 100644
--- a/src/sp/transport/tls/tls.c
+++ b/src/sp/transport/tls/tls.c
@@ -458,19 +458,11 @@ static void
tlstran_pipe_send(void *arg, nni_aio *aio)
{
tlstran_pipe *p = arg;
- int rv;
- if (nni_aio_begin(aio) != 0) {
- // No way to give the message back to the protocol, so
- // we just discard it silently to prevent it from leaking.
- nni_msg_free(nni_aio_get_msg(aio));
- nni_aio_set_msg(aio, NULL);
- return;
- }
+ nni_aio_reset(aio);
nni_mtx_lock(&p->mtx);
- if ((rv = nni_aio_schedule(aio, tlstran_pipe_send_cancel, p)) != 0) {
+ if (!nni_aio_start(aio, tlstran_pipe_send_cancel, p)) {
nni_mtx_unlock(&p->mtx);
- nni_aio_finish_error(aio, rv);
return;
}
nni_list_append(&p->sendq, aio);
@@ -523,15 +515,11 @@ static void
tlstran_pipe_recv(void *arg, nni_aio *aio)
{
tlstran_pipe *p = arg;
- int rv;
- if (nni_aio_begin(aio) != 0) {
- return;
- }
+ nni_aio_reset(aio);
nni_mtx_lock(&p->mtx);
- if ((rv = nni_aio_schedule(aio, tlstran_pipe_recv_cancel, p)) != 0) {
+ if (!nni_aio_start(aio, tlstran_pipe_recv_cancel, p)) {
nni_mtx_unlock(&p->mtx);
- nni_aio_finish_error(aio, rv);
return;
}
@@ -681,7 +669,9 @@ error:
nni_aio_finish_error(aio, rv);
}
switch (rv) {
-
+ case NNG_ECLOSED:
+ case NNG_ESTOPPED:
+ break;
case NNG_ENOMEM:
case NNG_ENOFILES:
// We need to cool down here, to avoid spinning.
@@ -837,12 +827,8 @@ static void
tlstran_ep_connect(void *arg, nni_aio *aio)
{
tlstran_ep *ep = arg;
- int rv;
-
- if (nni_aio_begin(aio) != 0) {
- return;
- }
+ nni_aio_reset(aio);
nni_mtx_lock(&ep->mtx);
if (ep->closed) {
nni_mtx_unlock(&ep->mtx);
@@ -854,9 +840,8 @@ tlstran_ep_connect(void *arg, nni_aio *aio)
nni_aio_finish_error(aio, NNG_EBUSY);
return;
}
- if ((rv = nni_aio_schedule(aio, tlstran_ep_cancel, ep)) != 0) {
+ if (!nni_aio_start(aio, tlstran_ep_cancel, ep)) {
nni_mtx_unlock(&ep->mtx);
- nni_aio_finish_error(aio, rv);
return;
}
ep->useraio = aio;
@@ -888,11 +873,8 @@ static void
tlstran_ep_accept(void *arg, nni_aio *aio)
{
tlstran_ep *ep = arg;
- int rv;
- if (nni_aio_begin(aio) != 0) {
- return;
- }
+ nni_aio_reset(aio);
nni_mtx_lock(&ep->mtx);
if (ep->closed) {
nni_mtx_unlock(&ep->mtx);
@@ -904,9 +886,8 @@ tlstran_ep_accept(void *arg, nni_aio *aio)
nni_aio_finish_error(aio, NNG_EBUSY);
return;
}
- if ((rv = nni_aio_schedule(aio, tlstran_ep_cancel, ep)) != 0) {
+ if (!nni_aio_start(aio, tlstran_ep_cancel, ep)) {
nni_mtx_unlock(&ep->mtx);
- nni_aio_finish_error(aio, rv);
return;
}
ep->useraio = aio;
diff --git a/src/supplemental/tls/tls_common.c b/src/supplemental/tls/tls_common.c
index a871e74e..96255a72 100644
--- a/src/supplemental/tls/tls_common.c
+++ b/src/supplemental/tls/tls_common.c
@@ -63,6 +63,7 @@ typedef struct {
nni_aio conn_aio; // system aio for connect/accept
nni_mtx lock;
bool closed;
+ nni_atomic_flag did_close;
bool hs_done;
nni_list send_queue;
nni_list recv_queue;
@@ -180,19 +181,16 @@ static void
tls_dialer_dial(void *arg, nng_aio *aio)
{
tls_dialer *d = arg;
- int rv;
tls_conn *conn;
+ int rv;
- if (nni_aio_begin(aio) != 0) {
- return;
- }
+ nni_aio_reset(aio);
if ((rv = tls_alloc(&conn, d->cfg, aio)) != 0) {
nni_aio_finish_error(aio, rv);
return;
}
- if ((rv = nni_aio_schedule(aio, tls_conn_cancel, conn)) != 0) {
- nni_aio_finish_error(aio, rv);
+ if (!nni_aio_start(aio, tls_conn_cancel, conn)) {
tls_free(conn);
return;
}
@@ -352,16 +350,13 @@ tls_listener_accept(void *arg, nng_aio *aio)
int rv;
tls_conn *conn;
- if (nni_aio_begin(aio) != 0) {
- return;
- }
+ nni_aio_reset(aio);
if ((rv = tls_alloc(&conn, l->cfg, aio)) != 0) {
nni_aio_finish_error(aio, rv);
return;
}
- if ((rv = nni_aio_schedule(aio, tls_conn_cancel, conn)) != 0) {
- nni_aio_finish_error(aio, rv);
+ if (!nni_aio_start(aio, tls_conn_cancel, conn)) {
tls_free(conn);
return;
}
@@ -483,21 +478,17 @@ tls_cancel(nni_aio *aio, void *arg, int rv)
static void
tls_send(void *arg, nni_aio *aio)
{
- int rv;
tls_conn *conn = arg;
- if (nni_aio_begin(aio) != 0) {
- return;
- }
+ nni_aio_reset(aio);
nni_mtx_lock(&conn->lock);
- if (conn->closed) {
+ if (!nni_aio_start(aio, tls_cancel, conn)) {
nni_mtx_unlock(&conn->lock);
- nni_aio_finish_error(aio, NNG_ECLOSED);
return;
}
- if ((rv = nni_aio_schedule(aio, tls_cancel, conn)) != 0) {
+ if (conn->closed) {
nni_mtx_unlock(&conn->lock);
- nni_aio_finish_error(aio, rv);
+ nni_aio_finish_error(aio, NNG_ECLOSED);
return;
}
nni_list_append(&conn->send_queue, aio);
@@ -508,21 +499,17 @@ tls_send(void *arg, nni_aio *aio)
static void
tls_recv(void *arg, nni_aio *aio)
{
- int rv;
tls_conn *conn = arg;
- if (nni_aio_begin(aio) != 0) {
- return;
- }
+ nni_aio_reset(aio);
nni_mtx_lock(&conn->lock);
- if (conn->closed) {
+ if (!nni_aio_start(aio, tls_cancel, conn)) {
nni_mtx_unlock(&conn->lock);
- nni_aio_finish_error(aio, NNG_ECLOSED);
return;
}
- if ((rv = nni_aio_schedule(aio, tls_cancel, conn)) != 0) {
+ if (conn->closed) {
nni_mtx_unlock(&conn->lock);
- nni_aio_finish_error(aio, rv);
+ nni_aio_finish_error(aio, NNG_ECLOSED);
return;
}
@@ -536,11 +523,13 @@ tls_close(void *arg)
{
tls_conn *conn = arg;
- nni_mtx_lock(&conn->lock);
- conn->ops.close((void *) (conn + 1));
- tls_tcp_error(conn, NNG_ECLOSED);
- nni_mtx_unlock(&conn->lock);
- nng_stream_close(conn->tcp);
+ if (!nni_atomic_flag_test_and_set(&conn->did_close)) {
+ nni_mtx_lock(&conn->lock);
+ conn->ops.close((void *) (conn + 1));
+ tls_tcp_error(conn, NNG_ECLOSED);
+ nni_mtx_unlock(&conn->lock);
+ nng_stream_close(conn->tcp);
+ }
}
static void
@@ -650,6 +639,7 @@ tls_alloc(tls_conn **conn_p, nng_tls_config *cfg, nng_aio *user_aio)
nni_aio_set_timeout(&conn->conn_aio, NNG_DURATION_INFINITE);
nni_aio_set_timeout(&conn->tcp_send, NNG_DURATION_INFINITE);
nni_aio_set_timeout(&conn->tcp_recv, NNG_DURATION_INFINITE);
+ nni_atomic_flag_reset(&conn->did_close);
conn->stream.s_close = tls_close;
conn->stream.s_free = tls_free;