aboutsummaryrefslogtreecommitdiff
path: root/src/platform/posix/posix_tcpconn.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2019-08-09 19:29:51 -0700
committerGarrett D'Amore <garrett@damore.org>2019-09-24 18:48:50 -0700
commite618abf8f3db2a94269a79c8901a51148d48fcc2 (patch)
tree1ca624cefb452bcfcf34daaf919ea77a5413bc15 /src/platform/posix/posix_tcpconn.c
parent906d5ea1b3d67bece941d8a4e0a049e5f6c65051 (diff)
downloadnng-e618abf8f3db2a94269a79c8901a51148d48fcc2.tar.gz
nng-e618abf8f3db2a94269a79c8901a51148d48fcc2.tar.bz2
nng-e618abf8f3db2a94269a79c8901a51148d48fcc2.zip
fixes #970 TCP connections through docker-proxy do not reconnect
Diffstat (limited to 'src/platform/posix/posix_tcpconn.c')
-rw-r--r--src/platform/posix/posix_tcpconn.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/platform/posix/posix_tcpconn.c b/src/platform/posix/posix_tcpconn.c
index 0d3c274d..6ca7013b 100644
--- a/src/platform/posix/posix_tcpconn.c
+++ b/src/platform/posix/posix_tcpconn.c
@@ -180,7 +180,7 @@ tcp_doread(nni_tcp_conn *c)
// No bytes indicates a closed descriptor.
// This implicitly completes this (all!) aio.
nni_aio_list_remove(aio);
- nni_aio_finish_error(aio, NNG_ECLOSED);
+ nni_aio_finish_error(aio, NNG_ECONNSHUT);
continue;
}
@@ -196,6 +196,22 @@ tcp_doread(nni_tcp_conn *c)
}
static void
+tcp_error(void *arg, int err)
+{
+ nni_tcp_conn *c = arg;
+ nni_aio *aio;
+
+ nni_mtx_lock(&c->mtx);
+ while (((aio = nni_list_first(&c->readq)) != NULL) ||
+ ((aio = nni_list_first(&c->writeq)) != NULL)) {
+ nni_aio_list_remove(aio);
+ nni_aio_finish_error(aio, err);
+ }
+ nni_posix_pfd_close(c->pfd);
+ nni_mtx_unlock(&c->mtx);
+}
+
+static void
tcp_close(void *arg)
{
nni_tcp_conn *c = arg;
@@ -242,7 +258,7 @@ tcp_cb(nni_posix_pfd *pfd, int events, void *arg)
nni_tcp_conn *c = arg;
if (events & (POLLHUP | POLLERR | POLLNVAL)) {
- tcp_close(c);
+ tcp_error(c, NNG_ECONNSHUT);
return;
}
nni_mtx_lock(&c->mtx);