aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/dialer.c17
-rw-r--r--src/core/dialer.h2
-rw-r--r--src/core/idhash.c79
-rw-r--r--src/core/idhash.h12
-rw-r--r--src/core/init.c13
-rw-r--r--src/core/listener.c15
-rw-r--r--src/core/listener.h2
-rw-r--r--src/core/pipe.c25
-rw-r--r--src/core/pipe.h3
-rw-r--r--src/core/socket.c22
-rw-r--r--src/core/socket.h3
-rw-r--r--src/core/stats.c35
-rw-r--r--src/core/stats.h2
13 files changed, 112 insertions, 118 deletions
diff --git a/src/core/dialer.c b/src/core/dialer.c
index e3f435db..c7bdfc3b 100644
--- a/src/core/dialer.c
+++ b/src/core/dialer.c
@@ -15,27 +15,14 @@
#include <stdio.h>
#include <string.h>
-// Functionality related to dialers.
+// Functionality related to dialing.
static void dialer_connect_start(nni_dialer *);
static void dialer_connect_cb(void *);
static void dialer_timer_cb(void *);
-static nni_id_map dialers;
+static nni_id_map dialers = NNI_ID_MAP_INITIALIZER(1, 0x7fffffff, 0);
static nni_mtx dialers_lk = NNI_MTX_INITIALIZER;
-void
-nni_dialer_sys_init(void)
-{
- nni_id_map_init(&dialers, 1, 0x7fffffff, false);
-}
-
-void
-nni_dialer_sys_fini(void)
-{
- nni_reap_drain();
- nni_id_map_fini(&dialers);
-}
-
uint32_t
nni_dialer_id(nni_dialer *d)
{
diff --git a/src/core/dialer.h b/src/core/dialer.h
index b6ba657b..7bc1547d 100644
--- a/src/core/dialer.h
+++ b/src/core/dialer.h
@@ -12,8 +12,6 @@
#ifndef CORE_DIALER_H
#define CORE_DIALER_H
-extern void nni_dialer_sys_init(void);
-extern void nni_dialer_sys_fini(void);
extern int nni_dialer_find(nni_dialer **, uint32_t);
extern int nni_dialer_hold(nni_dialer *);
extern void nni_dialer_rele(nni_dialer *);
diff --git a/src/core/idhash.c b/src/core/idhash.c
index c61850d2..3403b59e 100644
--- a/src/core/idhash.c
+++ b/src/core/idhash.c
@@ -1,5 +1,5 @@
//
-// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2021 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
@@ -15,9 +15,14 @@
struct nni_id_entry {
uint32_t key;
uint32_t skips;
- void * val;
+ void *val;
};
+static int id_reg_len = 0;
+static int id_reg_num = 0;
+static nni_id_map **id_reg_map = NULL;
+static nni_mtx id_reg_mtx = NNI_MTX_INITIALIZER;
+
void
nni_id_map_init(nni_id_map *m, uint32_t lo, uint32_t hi, bool randomize)
{
@@ -33,15 +38,15 @@ nni_id_map_init(nni_id_map *m, uint32_t lo, uint32_t hi, bool randomize)
m->id_count = 0;
m->id_load = 0;
m->id_cap = 0;
+ m->id_dyn_val = 0;
m->id_max_load = 0;
m->id_min_load = 0; // never shrink below this
m->id_min_val = lo;
m->id_max_val = hi;
if (randomize) {
- // NB: The range is inclusive.
- m->id_dyn_val = nni_random() % ((hi - lo) + 1) + lo;
+ m->id_flags = NNI_ID_FLAG_RANDOM;
} else {
- m->id_dyn_val = lo;
+ m->id_flags = 0;
}
}
@@ -103,6 +108,53 @@ nni_id_get(nni_id_map *m, uint32_t id)
}
static int
+id_map_register(nni_id_map *m)
+{
+ if ((m->id_flags & (NNI_ID_FLAG_STATIC | NNI_ID_FLAG_REGISTER)) !=
+ NNI_ID_FLAG_STATIC) {
+ return (0);
+ }
+ nni_mtx_lock(&id_reg_mtx);
+ if (id_reg_len <= id_reg_num) {
+ nni_id_map **mr;
+ int len = id_reg_len;
+ if (len < 10) {
+ len = 10;
+ } else {
+ len *= 2;
+ }
+ mr = nni_zalloc(sizeof(nni_id_map *) * len);
+ if (mr == NULL) {
+ nni_mtx_unlock(&id_reg_mtx);
+ return (NNG_ENOMEM);
+ }
+ id_reg_len = len;
+ memcpy(mr, id_reg_map, id_reg_num * sizeof(nni_id_map *));
+ id_reg_map = mr;
+ }
+ id_reg_map[id_reg_num++] = m;
+ m->id_flags |= NNI_ID_FLAG_REGISTER;
+ nni_mtx_unlock(&id_reg_mtx);
+ return (0);
+}
+
+void
+nni_id_map_sys_fini(void)
+{
+ nni_mtx_lock(&id_reg_mtx);
+ for (int i = 0; i < id_reg_num; i++) {
+ if (id_reg_map[i] != NULL) {
+ nni_id_map_fini(id_reg_map[i]);
+ }
+ }
+ nni_free(id_reg_map, sizeof(nni_id_map *) * id_reg_len);
+ id_reg_map = NULL;
+ id_reg_len = 0;
+ id_reg_num = 0;
+ nni_mtx_unlock(&id_reg_mtx);
+}
+
+static int
id_resize(nni_id_map *m)
{
size_t new_cap;
@@ -110,12 +162,19 @@ id_resize(nni_id_map *m)
nni_id_entry *new_entries;
nni_id_entry *old_entries;
uint32_t i;
+ int rv;
if ((m->id_load < m->id_max_load) && (m->id_load >= m->id_min_load)) {
// No resize needed.
return (0);
}
+ // if it is a statically declared map, register it so that we
+ // will free it at finalization time
+ if ((rv = id_map_register(m)) != 0) {
+ return (rv);
+ }
+
old_cap = m->id_cap;
new_cap = 8;
while (new_cap < (m->id_count * 2)) {
@@ -266,6 +325,16 @@ nni_id_alloc(nni_id_map *m, uint32_t *idp, void *val)
// Really more like ENOSPC.. the table is filled to max.
return (NNG_ENOMEM);
}
+ if (m->id_dyn_val == 0) {
+ if (m->id_flags & NNI_ID_FLAG_RANDOM) {
+ // NB: The range is inclusive.
+ m->id_dyn_val = nni_random() %
+ (m->id_max_val - m->id_min_val + 1) +
+ m->id_min_val;
+ } else {
+ m->id_dyn_val = m->id_min_val;
+ }
+ }
for (;;) {
id = m->id_dyn_val;
diff --git a/src/core/idhash.h b/src/core/idhash.h
index b2259853..e8894dfb 100644
--- a/src/core/idhash.h
+++ b/src/core/idhash.h
@@ -37,14 +37,26 @@ struct nni_id_map {
uint32_t id_min_val;
uint32_t id_max_val;
uint32_t id_dyn_val;
+ uint32_t id_flags;
nni_id_entry *id_entries;
};
+#define NNI_ID_FLAG_STATIC 1 // allocated statically
+#define NNI_ID_FLAG_RANDOM 2 // start at a random value
+#define NNI_ID_FLAG_REGISTER 4 // map is registered for finalization
+
extern void nni_id_map_init(nni_id_map *, uint32_t, uint32_t, bool);
extern void nni_id_map_fini(nni_id_map *);
extern void *nni_id_get(nni_id_map *, uint32_t);
extern int nni_id_set(nni_id_map *, uint32_t, void *);
extern int nni_id_alloc(nni_id_map *, uint32_t *, void *);
extern int nni_id_remove(nni_id_map *, uint32_t);
+extern void nni_id_map_sys_fini(void);
+
+#define NNI_ID_MAP_INITIALIZER(min, max, flags) \
+ { \
+ .id_min_val = (min), .id_max_val = (max), \
+ .id_flags = ((flags) | NNI_ID_FLAG_STATIC) \
+ }
#endif // CORE_IDHASH_H
diff --git a/src/core/init.c b/src/core/init.c
index f9dee9e2..f8ecb385 100644
--- a/src/core/init.c
+++ b/src/core/init.c
@@ -32,8 +32,7 @@ nni_init_helper(void)
}
#endif
- if (((rv = nni_stat_sys_init()) != 0) ||
- ((rv = nni_taskq_sys_init()) != 0) ||
+ if (((rv = nni_taskq_sys_init()) != 0) ||
((rv = nni_reap_sys_init()) != 0) ||
((rv = nni_timer_sys_init()) != 0) ||
((rv = nni_aio_sys_init()) != 0) ||
@@ -43,10 +42,6 @@ nni_init_helper(void)
}
// following never fail
- nni_sock_sys_init();
- nni_listener_sys_init();
- nni_dialer_sys_init();
- nni_pipe_sys_init();
nni_sp_tran_sys_init();
nni_inited = true;
@@ -68,16 +63,12 @@ nni_fini(void)
}
nni_sp_tran_sys_fini();
nni_tls_sys_fini();
- nni_pipe_sys_fini();
- nni_dialer_sys_fini();
- nni_listener_sys_fini();
- nni_sock_sys_fini();
nni_reap_drain();
nni_aio_sys_fini();
nni_timer_sys_fini();
nni_taskq_sys_fini();
nni_reap_sys_fini(); // must be before timer and aio (expire)
- nni_stat_sys_fini();
+ nni_id_map_sys_fini();
nni_plat_fini();
nni_inited = false;
diff --git a/src/core/listener.c b/src/core/listener.c
index 4d4a4e24..09fddf03 100644
--- a/src/core/listener.c
+++ b/src/core/listener.c
@@ -21,22 +21,9 @@ static void listener_accept_start(nni_listener *);
static void listener_accept_cb(void *);
static void listener_timer_cb(void *);
-static nni_id_map listeners;
+static nni_id_map listeners = NNI_ID_MAP_INITIALIZER(1, 0x7fffffff, 0);
static nni_mtx listeners_lk = NNI_MTX_INITIALIZER;
-void
-nni_listener_sys_init(void)
-{
- nni_id_map_init(&listeners, 1, 0x7fffffff, false);
-}
-
-void
-nni_listener_sys_fini(void)
-{
- nni_reap_drain();
- nni_id_map_fini(&listeners);
-}
-
uint32_t
nni_listener_id(nni_listener *l)
{
diff --git a/src/core/listener.h b/src/core/listener.h
index 9b1ad907..c6c0b5d3 100644
--- a/src/core/listener.h
+++ b/src/core/listener.h
@@ -12,8 +12,6 @@
#ifndef CORE_LISTENER_H
#define CORE_LISTENER_H
-extern void nni_listener_sys_init(void);
-extern void nni_listener_sys_fini(void);
extern int nni_listener_find(nni_listener **, uint32_t);
extern int nni_listener_hold(nni_listener *);
extern void nni_listener_rele(nni_listener *);
diff --git a/src/core/pipe.c b/src/core/pipe.c
index 2b66ad81..36b77d91 100644
--- a/src/core/pipe.c
+++ b/src/core/pipe.c
@@ -19,8 +19,9 @@
// Operations on pipes (to the transport) are generally blocking operations,
// performed in the context of the protocol.
-static nni_id_map pipes;
-static nni_mtx pipes_lk;
+static nni_id_map pipes =
+ NNI_ID_MAP_INITIALIZER(1, 0x7fffffff, NNI_ID_FLAG_RANDOM);
+static nni_mtx pipes_lk = NNI_MTX_INITIALIZER;
static void pipe_destroy(void *);
@@ -29,24 +30,6 @@ static nni_reap_list pipe_reap_list = {
.rl_func = pipe_destroy,
};
-void
-nni_pipe_sys_init(void)
-{
- nni_mtx_init(&pipes_lk);
-
- // Pipe IDs need their high bit clear, and we want
- // them to start at a random value.
- nni_id_map_init(&pipes, 1, 0x7fffffff, true);
-}
-
-void
-nni_pipe_sys_fini(void)
-{
- nni_reap_drain();
- nni_mtx_fini(&pipes_lk);
- nni_id_map_fini(&pipes);
-}
-
static void
pipe_destroy(void *arg)
{
@@ -248,7 +231,7 @@ pipe_create(nni_pipe **pp, nni_sock *sock, nni_sp_tran *tran, void *tran_data)
nni_pipe *p;
int rv;
void *sock_data = nni_sock_proto_data(sock);
- nni_proto_pipe_ops *pops = nni_sock_proto_pipe_ops(sock);
+ nni_proto_pipe_ops *pops = nni_sock_proto_pipe_ops(sock);
size_t sz;
sz = NNI_ALIGN_UP(sizeof(*p)) + pops->pipe_size;
diff --git a/src/core/pipe.h b/src/core/pipe.h
index 065b3dcf..458a42d9 100644
--- a/src/core/pipe.h
+++ b/src/core/pipe.h
@@ -19,9 +19,6 @@
#include "core/thread.h"
#include "sp/transport.h"
-extern void nni_pipe_sys_init(void);
-extern void nni_pipe_sys_fini(void);
-
// AIO
extern void nni_pipe_recv(nni_pipe *, nni_aio *);
extern void nni_pipe_send(nni_pipe *, nni_aio *);
diff --git a/src/core/socket.c b/src/core/socket.c
index d9ac12b6..a8850b5d 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -101,10 +101,10 @@ struct nni_socket {
#endif
};
-static nni_list sock_list = NNI_LIST_INITIALIZER(sock_list, nni_sock, s_node);
-static nni_mtx sock_lk = NNI_MTX_INITIALIZER;
-static nni_id_map sock_ids;
-static nni_id_map ctx_ids;
+static nni_list sock_list = NNI_LIST_INITIALIZER(sock_list, nni_sock, s_node);
+static nni_mtx sock_lk = NNI_MTX_INITIALIZER;
+static nni_id_map sock_ids = NNI_ID_MAP_INITIALIZER(1, 0x7fffffff, 0);
+static nni_id_map ctx_ids = NNI_ID_MAP_INITIALIZER(1, 0x7fffffff, 0);
static void nni_ctx_destroy(nni_ctx *);
@@ -607,20 +607,6 @@ nni_sock_create(nni_sock **sp, const nni_proto *proto)
return (rv);
}
-void
-nni_sock_sys_init(void)
-{
- nni_id_map_init(&sock_ids, 1, 0x7fffffff, false);
- nni_id_map_init(&ctx_ids, 1, 0x7fffffff, false);
-}
-
-void
-nni_sock_sys_fini(void)
-{
- nni_id_map_fini(&sock_ids);
- nni_id_map_fini(&ctx_ids);
-}
-
int
nni_sock_open(nni_sock **sockp, const nni_proto *proto)
{
diff --git a/src/core/socket.h b/src/core/socket.h
index 59ceffa8..beebfbce 100644
--- a/src/core/socket.h
+++ b/src/core/socket.h
@@ -11,9 +11,6 @@
#ifndef CORE_SOCKET_H
#define CORE_SOCKET_H
-extern void nni_sock_sys_init(void);
-extern void nni_sock_sys_fini(void);
-
extern int nni_sock_find(nni_sock **, uint32_t);
extern void nni_sock_rele(nni_sock *);
extern int nni_sock_open(nni_sock **, const nni_proto *);
diff --git a/src/core/stats.c b/src/core/stats.c
index f7e52fb0..f9de055e 100644
--- a/src/core/stats.c
+++ b/src/core/stats.c
@@ -31,9 +31,19 @@ struct nng_stat {
};
#ifdef NNG_ENABLE_STATS
-static nni_stat_item stats_root;
-static nni_mtx stats_lock = NNI_MTX_INITIALIZER;
-static nni_mtx stats_val_lock = NNI_MTX_INITIALIZER;
+static nni_stat_info stats_root_info = {
+ .si_name = "",
+ .si_desc = "all statistics",
+ .si_type = NNG_STAT_SCOPE,
+};
+
+static nni_stat_item stats_root = {
+ .si_children = NNI_LIST_INITIALIZER(
+ stats_root.si_children, nni_stat_item, si_node),
+ .si_info = &stats_root_info,
+};
+static nni_mtx stats_lock = NNI_MTX_INITIALIZER;
+static nni_mtx stats_val_lock = NNI_MTX_INITIALIZER;
#endif
void
@@ -488,25 +498,6 @@ nng_stat_find_listener(nng_stat *stat, nng_listener l)
return (nng_stat_find_scope(stat, "listener", nng_listener_id(l)));
}
-int
-nni_stat_sys_init(void)
-{
-#ifdef NNG_ENABLE_STATS
- static const nni_stat_info root = {
- .si_name = "",
- .si_desc = "all statistics",
- .si_type = NNG_STAT_SCOPE,
- };
- nni_stat_init(&stats_root, &root);
-#endif
- return (0);
-}
-
-void
-nni_stat_sys_fini(void)
-{
-}
-
#ifdef NNG_ENABLE_STATS
void
stat_sprint_scope(nni_stat *stat, char **scope, int *lenp)
diff --git a/src/core/stats.h b/src/core/stats.h
index de1879ca..e80f18df 100644
--- a/src/core/stats.h
+++ b/src/core/stats.h
@@ -76,7 +76,5 @@ void nni_stat_set_string(nni_stat_item *, const char *);
void nni_stat_init(nni_stat_item *, const nni_stat_info *);
void nni_stat_inc(nni_stat_item *, uint64_t);
void nni_stat_dec(nni_stat_item *, uint64_t);
-int nni_stat_sys_init(void);
-void nni_stat_sys_fini(void);
#endif // CORE_STATS_H