aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2018-08-13 15:12:24 +0500
committerGarrett D'Amore <garrett@damore.org>2018-08-14 10:25:44 +0500
commit0ad1c6e19abd8173a8c188b194799b901e9ffec5 (patch)
treefc781d861c28ca6b50f72c010676686a0de2d4cf /src
parent58b50fba5ebfd4a1176d48458ab8c43a72b76d8b (diff)
downloadnng-0ad1c6e19abd8173a8c188b194799b901e9ffec5.tar.gz
nng-0ad1c6e19abd8173a8c188b194799b901e9ffec5.tar.bz2
nng-0ad1c6e19abd8173a8c188b194799b901e9ffec5.zip
fixes #647 IPC and TCP fixes from rewrite
Diffstat (limited to 'src')
-rw-r--r--src/transport/ipc/ipc.c30
-rw-r--r--src/transport/tcp/tcp.c54
2 files changed, 48 insertions, 36 deletions
diff --git a/src/transport/ipc/ipc.c b/src/transport/ipc/ipc.c
index 7ba5bc52..8141b588 100644
--- a/src/transport/ipc/ipc.c
+++ b/src/transport/ipc/ipc.c
@@ -119,9 +119,6 @@ ipctran_pipe_fini(void *arg)
ipctran_pipe *p = arg;
ipctran_ep * ep;
- if (p == NULL) {
- return;
- }
ipctran_pipe_stop(p);
if ((ep = p->ep) != NULL) {
nni_mtx_lock(&ep->mtx);
@@ -191,18 +188,26 @@ static void
ipctran_pipe_conn_cb(void *arg)
{
ipctran_pipe *p = arg;
+ ipctran_ep * ep = p->ep;
nni_aio * aio = p->connaio;
+ nni_aio * uaio;
nni_iov iov;
int rv;
- nni_mtx_lock(&p->ep->mtx);
- if ((rv = nni_aio_result(aio)) != 0) {
- nni_aio *uaio = p->useraio;
- p->useraio = NULL;
- nni_mtx_unlock(&p->ep->mtx);
- if (uaio != NULL) {
- nni_aio_finish_error(uaio, rv);
- }
+ nni_mtx_lock(&ep->mtx);
+ uaio = p->useraio;
+ if ((rv = nni_aio_result(aio)) == 0) {
+ p->conn = nni_aio_get_output(aio, 0);
+ }
+ if (uaio == NULL) {
+ nni_mtx_unlock(&ep->mtx);
+ ipctran_pipe_reap(p);
+ return;
+ }
+ if (rv != 0) {
+ p->useraio = NULL;
+ nni_mtx_unlock(&ep->mtx);
+ nni_aio_finish_error(uaio, rv);
ipctran_pipe_reap(p);
return;
}
@@ -222,7 +227,7 @@ ipctran_pipe_conn_cb(void *arg)
iov.iov_buf = &p->txhead[0];
nni_aio_set_iov(p->negoaio, 1, &iov);
nni_ipc_conn_send(p->conn, p->negoaio);
- nni_mtx_unlock(&p->ep->mtx);
+ nni_mtx_unlock(&ep->mtx);
}
static void
@@ -708,6 +713,7 @@ ipctran_ep_fini(void *arg)
if (ep->listener != NULL) {
nni_ipc_listener_fini(ep->listener);
}
+ nni_mtx_unlock(&ep->mtx);
nni_mtx_fini(&ep->mtx);
NNI_FREE_STRUCT(ep);
}
diff --git a/src/transport/tcp/tcp.c b/src/transport/tcp/tcp.c
index 5b200644..c58d66ec 100644
--- a/src/transport/tcp/tcp.c
+++ b/src/transport/tcp/tcp.c
@@ -125,9 +125,6 @@ tcptran_pipe_fini(void *arg)
tcptran_pipe *p = arg;
tcptran_ep * ep;
- if (p == NULL) {
- return;
- }
tcptran_pipe_stop(p);
if ((ep = p->ep) != NULL) {
nni_mtx_lock(&ep->mtx);
@@ -215,27 +212,27 @@ tcptran_pipe_conn_cancel(nni_aio *aio, int rv)
static void
tcptran_pipe_rslv_cb(void *arg)
{
- tcptran_pipe * p = arg;
- tcptran_ep * ep = p->ep;
- nni_aio * aio = p->rslvaio;
- nni_tcp_dialer *d;
- int rv;
+ tcptran_pipe *p = arg;
+ tcptran_ep * ep = p->ep;
+ nni_aio * aio = p->rslvaio;
+ nni_aio * uaio;
+ int rv;
nni_mtx_lock(&ep->mtx);
- d = ep->dialer;
- rv = (d == NULL) ? NNG_ECLOSED : nni_aio_result(aio);
- if (rv != 0) {
- nni_aio *uaio;
- if ((uaio = p->useraio) != NULL) {
- p->useraio = NULL;
- nni_aio_finish_error(uaio, rv);
- }
+ if ((uaio = p->useraio) == NULL) {
+ nni_mtx_unlock(&ep->mtx);
+ tcptran_pipe_reap(p);
+ return;
+ }
+ if ((rv = nni_aio_result(aio)) != 0) {
+ p->useraio = NULL;
nni_mtx_unlock(&ep->mtx);
+ nni_aio_finish_error(uaio, rv);
tcptran_pipe_reap(p);
return;
}
- nni_tcp_dialer_dial(d, &p->sa, p->connaio);
+ nni_tcp_dialer_dial(ep->dialer, &p->sa, p->connaio);
nni_mtx_unlock(&ep->mtx);
}
@@ -245,21 +242,29 @@ tcptran_pipe_conn_cb(void *arg)
tcptran_pipe *p = arg;
tcptran_ep * ep = p->ep;
nni_aio * aio = p->connaio;
+ nni_aio * uaio;
nni_iov iov;
int rv;
nni_mtx_lock(&ep->mtx);
- if ((rv = nni_aio_result(aio)) != 0) {
- nni_aio *uaio = p->useraio;
- p->useraio = NULL;
+ uaio = p->useraio;
+ if ((rv = nni_aio_result(aio)) == 0) {
+ p->conn = nni_aio_get_output(aio, 0);
+ }
+
+ if ((uaio = p->useraio) == NULL) {
nni_mtx_unlock(&ep->mtx);
- if (uaio != NULL) {
- nni_aio_finish_error(uaio, rv);
- }
tcptran_pipe_reap(p);
return;
}
- p->conn = nni_aio_get_output(aio, 0);
+
+ if (rv != 0) {
+ p->useraio = NULL;
+ nni_mtx_unlock(&ep->mtx);
+ nni_aio_finish_error(uaio, rv);
+ tcptran_pipe_reap(p);
+ return;
+ }
p->txlen[0] = 0;
p->txlen[1] = 'S';
p->txlen[2] = 'P';
@@ -711,6 +716,7 @@ tcptran_ep_fini(void *arg)
if (ep->listener != NULL) {
nni_tcp_listener_fini(ep->listener);
}
+ nni_mtx_unlock(&ep->mtx);
nni_mtx_fini(&ep->mtx);
NNI_FREE_STRUCT(ep);
}