From 10512fc50e6184397206a41c157c09d9b02e9e1a Mon Sep 17 00:00:00 2001 From: David Timber Date: Sat, 11 Jan 2020 18:03:47 +1100 Subject: staged resolv_worker * replaced RNG from `rnd` to `mbedtls_ctr_drbg` * use of `uint_fastN_t` where appropriate * heartbeat protocol draft * improved worker scheduling mech --- src/iset.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/iset.c (limited to 'src/iset.c') diff --git a/src/iset.c b/src/iset.c new file mode 100644 index 0000000..b0dcb12 --- /dev/null +++ b/src/iset.c @@ -0,0 +1,78 @@ +#include "iset.h" +#include "util_rt.h" + +#include +#include + + +static int iset_comp_func (const void *a, const void *b) { + return + *(const prne_iset_val_t*)a < *(const prne_iset_val_t*)b ? -1 : + *(const prne_iset_val_t*)a > *(const prne_iset_val_t*)b ? 1 : + 0; +} + + +void prne_init_iset (prne_iset_t *s) { + s->arr = NULL; + s->size = 0; +} + +void prne_free_iset (prne_iset_t *s) { + prne_free(s->arr); + s->arr = NULL; + s->size = 0; +} + +void prne_iset_clear (prne_iset_t *s) { + prne_free(s->arr); + s->arr = NULL; + s->size = 0; +} + +bool prne_iset_insert (prne_iset_t *s, const prne_iset_val_t v) { + void *ny_mem; + + if (prne_iset_lookup(s, v)) { + return true; + } + + ny_mem = prne_realloc(s->arr, sizeof(prne_iset_val_t), s->size + 1); + if (ny_mem == NULL) { + return false; + } + s->arr = (prne_iset_val_t*)ny_mem; + s->arr[s->size] = v; + s->size += 1; + qsort(s->arr, s->size, sizeof(prne_iset_val_t), iset_comp_func); + + return true; +} + +void prne_iset_erase (prne_iset_t *s, const prne_iset_val_t v) { + prne_iset_val_t *p; + + p = (prne_iset_val_t*)bsearch(&v, s->arr, s->size, sizeof(prne_iset_val_t), iset_comp_func); + if (p != NULL) { + if (s->size == 1) { + prne_free(s->arr); + s->arr = NULL; + s->size = 0; + } + else { + void *ny_mem; + + memmove(p, p + 1, sizeof(prne_iset_val_t) * (s->size - 1 - (p - s->arr))); + + s->size -= 1; + ny_mem = prne_realloc(s->arr, sizeof(prne_iset_val_t), s->size); + if (ny_mem != NULL) { + s->arr = (prne_iset_val_t*)ny_mem; + } + } + } +} + +bool prne_iset_lookup (prne_iset_t *s, const prne_iset_val_t v) { + return bsearch(&v, s->arr, s->size, sizeof(prne_iset_val_t), iset_comp_func) != NULL; +} -- cgit