aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2024-11-21 22:20:50 -0800
committerGarrett D'Amore <garrett@damore.org>2024-11-21 22:20:50 -0800
commit8abf99028c3c3d26f0eba76fa4b3437c082a8874 (patch)
tree936f27881ac72579dab7161f4136d417c75ccf3c /src/core
parent73b3ed5a38cdd2312351ea8f19c3c89cbfc1154c (diff)
downloadnng-8abf99028c3c3d26f0eba76fa4b3437c082a8874.tar.gz
nng-8abf99028c3c3d26f0eba76fa4b3437c082a8874.tar.bz2
nng-8abf99028c3c3d26f0eba76fa4b3437c082a8874.zip
Avoid extra allocs for listener url.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/listener.c25
-rw-r--r--src/core/sockimpl.h2
-rw-r--r--src/core/url.c14
-rw-r--r--src/core/url.h1
4 files changed, 24 insertions, 18 deletions
diff --git a/src/core/listener.c b/src/core/listener.c
index 8fa50a4f..c6c37abe 100644
--- a/src/core/listener.c
+++ b/src/core/listener.c
@@ -43,7 +43,7 @@ nni_listener_destroy(nni_listener *l)
if (l->l_data != NULL) {
l->l_ops.l_fini(l->l_data);
}
- nng_url_free(l->l_url);
+ nni_url_fini(&l->l_url);
NNI_FREE_STRUCT(l);
}
@@ -203,22 +203,20 @@ nni_listener_create(nni_listener **lp, nni_sock *s, const char *url_str)
nni_sp_tran *tran;
nni_listener *l;
int rv;
- nng_url *url;
- if ((rv = nng_url_parse(&url, url_str)) != 0) {
+ if ((l = NNI_ALLOC_STRUCT(l)) == NULL) {
+ return (NNG_ENOMEM);
+ }
+ if ((rv = nni_url_parse_inline(&l->l_url, url_str)) != 0) {
+ NNI_FREE_STRUCT(l);
return (rv);
}
- if (((tran = nni_sp_tran_find(url)) == NULL) ||
+ if (((tran = nni_sp_tran_find(&l->l_url)) == NULL) ||
(tran->tran_listener == NULL)) {
- nng_url_free(url);
+ nni_url_fini(&l->l_url);
+ NNI_FREE_STRUCT(l);
return (NNG_ENOTSUP);
}
-
- if ((l = NNI_ALLOC_STRUCT(l)) == NULL) {
- nng_url_free(url);
- return (NNG_ENOMEM);
- }
- l->l_url = url;
l->l_closed = false;
l->l_data = NULL;
l->l_ref = 1;
@@ -245,7 +243,8 @@ nni_listener_create(nni_listener **lp, nni_sock *s, const char *url_str)
listener_stats_init(l);
#endif
- if ((rv != 0) || ((rv = l->l_ops.l_init(&l->l_data, url, l)) != 0) ||
+ if ((rv != 0) ||
+ ((rv = l->l_ops.l_init(&l->l_data, &l->l_url, l)) != 0) ||
((rv = nni_sock_add_listener(s, l)) != 0)) {
nni_mtx_lock(&listeners_lk);
nni_id_remove(&listeners, l->l_id);
@@ -486,7 +485,7 @@ nni_listener_getopt(
// override. This allows the URL to be created with wildcards,
// that are resolved later.
if (strcmp(name, NNG_OPT_URL) == 0) {
- return (nni_copyout_str(l->l_url->u_rawurl, val, szp, t));
+ return (nni_copyout_str(l->l_url.u_rawurl, val, szp, t));
}
return (nni_sock_getopt(l->l_sock, name, val, szp, t));
diff --git a/src/core/sockimpl.h b/src/core/sockimpl.h
index deb226e4..8e2abb18 100644
--- a/src/core/sockimpl.h
+++ b/src/core/sockimpl.h
@@ -63,7 +63,6 @@ struct nni_listener {
uint32_t l_id; // endpoint id
nni_list_node l_node; // per socket list
nni_sock *l_sock;
- nng_url *l_url;
int l_ref;
bool l_closed; // full shutdown
nni_atomic_flag l_closing; // close started (shutdown)
@@ -72,6 +71,7 @@ struct nni_listener {
nni_aio l_acc_aio;
nni_aio l_tmo_aio;
nni_reap_node l_reap;
+ nng_url l_url;
#ifdef NNG_ENABLE_STATS
nni_stat_item st_root;
diff --git a/src/core/url.c b/src/core/url.c
index af6be581..7af6a822 100644
--- a/src/core/url.c
+++ b/src/core/url.c
@@ -525,13 +525,19 @@ nng_url_parse(nng_url **urlp, const char *raw)
}
void
+nni_url_fini(nng_url *url)
+{
+ nni_strfree(url->u_rawurl);
+ if (url->u_bufsz != 0) {
+ nni_free(url->u_buffer, url->u_bufsz);
+ }
+}
+
+void
nng_url_free(nng_url *url)
{
if (url != NULL) {
- nni_strfree(url->u_rawurl);
- if (url->u_bufsz != 0) {
- nni_free(url->u_buffer, url->u_bufsz);
- }
+ nni_url_fini(url);
NNI_FREE_STRUCT(url);
}
}
diff --git a/src/core/url.h b/src/core/url.h
index c0ca32a0..0f5f33c9 100644
--- a/src/core/url.h
+++ b/src/core/url.h
@@ -34,5 +34,6 @@ extern int nni_url_asprintf_port(char **, const nng_url *, int);
extern size_t nni_url_decode(uint8_t *, const char *, size_t);
extern int nni_url_to_address(nng_sockaddr *, const nng_url *);
extern int nni_url_parse_inline(nng_url *, const char *);
+extern void nni_url_fini(nng_url *);
#endif // CORE_URL_H