aboutsummaryrefslogtreecommitdiff
path: root/src/supplemental
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2020-10-31 18:47:07 -0700
committerGarrett D'Amore <garrett@damore.org>2020-10-31 23:10:12 -0700
commit452ecf5ae83adc9ae77518746f4f81171c42248c (patch)
treed81730eef3c19775abf0715831dc18e3f9885d21 /src/supplemental
parent587bc765ee69acfabf3bc8b88a70806c07b61f87 (diff)
downloadnng-452ecf5ae83adc9ae77518746f4f81171c42248c.tar.gz
nng-452ecf5ae83adc9ae77518746f4f81171c42248c.tar.bz2
nng-452ecf5ae83adc9ae77518746f4f81171c42248c.zip
fixes #1311 reduce wasted use for nni_aio
fixes #1317 IPv6 listener get port is incorrect fixes #1319 Want symbolic service names This is phase 1 of reducing the memory foot-print of aios, and also of pipes. This removes the largest consumer the socket address information, from the aio, which was only used by a few consumers.
Diffstat (limited to 'src/supplemental')
-rw-r--r--src/supplemental/tcp/tcp.c72
1 files changed, 26 insertions, 46 deletions
diff --git a/src/supplemental/tcp/tcp.c b/src/supplemental/tcp/tcp.c
index 2fb7f56d..cde79051 100644
--- a/src/supplemental/tcp/tcp.c
+++ b/src/supplemental/tcp/tcp.c
@@ -1,5 +1,5 @@
//
-// Copyright 2019 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
// Copyright 2019 Devolutions <info@devolutions.net>
//
@@ -9,7 +9,6 @@
// found online at https://opensource.org/licenses/MIT.
//
-#include <stddef.h>
#include <stdint.h>
#include <string.h>
@@ -28,7 +27,6 @@ typedef struct {
nni_tcp_dialer * d; // platform dialer implementation
nni_aio * resaio; // resolver aio
nni_aio * conaio; // platform connection aio
- nni_list resaios;
nni_list conaios;
nni_mtx mtx;
} tcp_dialer;
@@ -45,8 +43,6 @@ tcp_dial_cancel(nni_aio *aio, void *arg, int rv)
if (nni_list_empty(&d->conaios)) {
nni_aio_abort(d->conaio, NNG_ECANCELED);
- }
- if (nni_list_empty(&d->resaios)) {
nni_aio_abort(d->resaio, NNG_ECANCELED);
}
}
@@ -54,6 +50,15 @@ tcp_dial_cancel(nni_aio *aio, void *arg, int rv)
}
static void
+tcp_dial_start_next(tcp_dialer *d)
+{
+ if (nni_list_empty(&d->conaios)) {
+ return;
+ }
+ nni_resolv_ip(d->host, d->port, d->af, false, &d->sa, d->resaio);
+}
+
+static void
tcp_dial_res_cb(void *arg)
{
tcp_dialer *d = arg;
@@ -61,34 +66,27 @@ tcp_dial_res_cb(void *arg)
int rv;
nni_mtx_lock(&d->mtx);
- if (d->closed || ((aio = nni_list_first(&d->resaios)) == NULL)) {
+ if (d->closed || ((aio = nni_list_first(&d->conaios)) == NULL)) {
// ignore this.
- while ((aio = nni_list_first(&d->resaios)) != NULL) {
- nni_list_remove(&d->resaios, aio);
+ while ((aio = nni_list_first(&d->conaios)) != NULL) {
+ nni_list_remove(&d->conaios, aio);
nni_aio_finish_error(aio, NNG_ECLOSED);
}
nni_mtx_unlock(&d->mtx);
return;
}
- nni_list_remove(&d->resaios, aio);
-
if ((rv = nni_aio_result(d->resaio)) != 0) {
+ nni_list_remove(&d->conaios, aio);
nni_aio_finish_error(aio, rv);
+
+ // try DNS again for next connection...
+ tcp_dial_start_next(d);
+
} else {
- nng_sockaddr sa;
- nni_aio_get_sockaddr(d->resaio, &sa);
- nni_aio_set_sockaddr(aio, &sa);
- nni_list_append(&d->conaios, aio);
- if (nni_list_first(&d->conaios) == aio) {
- nni_aio_set_sockaddr(d->conaio, &sa);
- nni_tcp_dial(d->d, d->conaio);
- }
+ nni_tcp_dial(d->d, &d->sa, d->conaio);
}
- if (!nni_list_empty(&d->resaios)) {
- nni_tcp_resolv(d->host, d->port, d->af, 0, d->resaio);
- }
nni_mtx_unlock(&d->mtx);
}
@@ -118,12 +116,7 @@ tcp_dial_con_cb(void *arg)
nni_aio_finish(aio, 0, 0);
}
- if ((aio = nni_list_first(&d->conaios)) != NULL) {
- nng_sockaddr sa;
- nni_aio_get_sockaddr(aio, &sa);
- nni_aio_set_sockaddr(d->conaio, &sa);
- nni_tcp_dial(d->d, d->conaio);
- }
+ tcp_dial_start_next(d);
nni_mtx_unlock(&d->mtx);
}
@@ -134,10 +127,6 @@ tcp_dialer_close(void *arg)
nni_aio * aio;
nni_mtx_lock(&d->mtx);
d->closed = true;
- while ((aio = nni_list_first(&d->resaios)) != NULL) {
- nni_list_remove(&d->resaios, aio);
- nni_aio_finish_error(aio, NNG_ECLOSED);
- }
while ((aio = nni_list_first(&d->conaios)) != NULL) {
nni_list_remove(&d->conaios, aio);
nni_aio_finish_error(aio, NNG_ECLOSED);
@@ -189,17 +178,9 @@ tcp_dialer_dial(void *arg, nng_aio *aio)
nni_aio_finish_error(aio, rv);
return;
}
- if (d->host != NULL) {
- nni_list_append(&d->resaios, aio);
- if (nni_list_first(&d->resaios) == aio) {
- nni_tcp_resolv(d->host, d->port, d->af, 0, d->resaio);
- }
- } else {
- nni_list_append(&d->conaios, aio);
- if (nni_list_first(&d->conaios) == aio) {
- nni_aio_set_sockaddr(d->conaio, &d->sa);
- nni_tcp_dial(d->d, d->conaio);
- }
+ nni_list_append(&d->conaios, aio);
+ if (nni_list_first(&d->conaios) == aio) {
+ tcp_dial_start_next(d);
}
nni_mtx_unlock(&d->mtx);
}
@@ -231,7 +212,6 @@ tcp_dialer_alloc(tcp_dialer **dp)
}
nni_mtx_init(&d->mtx);
- nni_aio_list_init(&d->resaios);
nni_aio_list_init(&d->conaios);
if (((rv = nni_aio_alloc(&d->resaio, tcp_dial_res_cb, d)) != 0) ||
@@ -352,8 +332,9 @@ tcp_listener_get_port(void *arg, void *buf, size_t *szp, nni_type t)
break;
case NNG_AF_INET6:
- paddr = (void *) &sa.s_in.sa_port;
+ paddr = (void *) &sa.s_in6.sa_port;
break;
+
default:
paddr = NULL;
break;
@@ -442,14 +423,13 @@ nni_tcp_listener_alloc(nng_stream_listener **lp, const nng_url *url)
if ((h != NULL) && ((strcmp(h, "*") == 0) || (strcmp(h, "") == 0))) {
h = NULL;
}
- nni_tcp_resolv(h, url->u_port, af, 1, aio);
+ nni_resolv_ip(h, url->u_port, af, true, &sa, aio);
nni_aio_wait(aio);
if ((rv = nni_aio_result(aio)) != 0) {
nni_aio_free(aio);
return (rv);
}
- nni_aio_get_sockaddr(aio, &sa);
nni_aio_free(aio);
return (tcp_listener_alloc_addr(lp, &sa));