diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/dialer.c | 17 | ||||
| -rw-r--r-- | src/core/dialer.h | 2 | ||||
| -rw-r--r-- | src/core/idhash.c | 79 | ||||
| -rw-r--r-- | src/core/idhash.h | 12 | ||||
| -rw-r--r-- | src/core/init.c | 13 | ||||
| -rw-r--r-- | src/core/listener.c | 15 | ||||
| -rw-r--r-- | src/core/listener.h | 2 | ||||
| -rw-r--r-- | src/core/pipe.c | 25 | ||||
| -rw-r--r-- | src/core/pipe.h | 3 | ||||
| -rw-r--r-- | src/core/socket.c | 22 | ||||
| -rw-r--r-- | src/core/socket.h | 3 | ||||
| -rw-r--r-- | src/core/stats.c | 35 | ||||
| -rw-r--r-- | src/core/stats.h | 2 |
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 |
