static int init_resolver(struct engine *engine)
{
/* Open resolution context */
- engine->resolver.trust_anchors = map_make();
- engine->resolver.negative_anchors = map_make();
+ engine->resolver.trust_anchors = map_make(NULL);
+ engine->resolver.negative_anchors = map_make(NULL);
engine->resolver.pool = engine->pool;
engine->resolver.modules = &engine->modules;
/* Create OPT RR */
typedef struct knot_pkt knot_pkt_t;
typedef struct {
void *root;
- map_alloc_f malloc;
- map_free_f free;
- void *baton;
+ struct knot_mm *pool;
} map_t;
struct kr_qflags {
_Bool NO_MINIMIZE : 1;
{
if (net != NULL) {
net->loop = loop;
- net->endpoints = map_make();
- net->tls_client_params = map_make();
+ net->endpoints = map_make(NULL);
+ net->tls_client_params = map_make(NULL);
}
}
memset(&worker->pkt_pool, 0, sizeof(worker->pkt_pool));
worker->pkt_pool.ctx = mp_new (4 * sizeof(knot_pkt_t));
worker->pkt_pool.alloc = (knot_mm_alloc_t) mp_alloc;
- worker->outgoing = map_make();
- worker->tcp_connected = map_make();
- worker->tcp_waiting = map_make();
+ worker->outgoing = map_make(NULL);
+ worker->tcp_connected = map_make(NULL);
+ worker->tcp_waiting = map_make(NULL);
worker->tcp_pipeline_max = MAX_PIPELINED;
memset(&worker->stats, 0, sizeof(worker->stats));
return kr_ok();
#include <stdlib.h>
#include "map.h"
+#include "lib/utils.h"
/* Exports */
#if defined _WIN32 || defined __CYGWIN__
return (cb_node_t *)(p - 1);
}
-/* Standard memory allocation functions */
-static void *malloc_std(void *baton, size_t size) {
- (void)baton; /* Prevent compiler warnings */
- return malloc(size);
-}
-
-static void free_std(void *baton, void *ptr) {
- (void)baton; /* Prevent compiler warnings */
- free(ptr);
-}
-
/* Static helper functions */
static void cbt_traverse_delete(map_t *map, void *top)
{
cb_node_t *q = ref_get_internal(p);
cbt_traverse_delete(map, q->child[0]);
cbt_traverse_delete(map, q->child[1]);
- map->free(map->baton, q);
+ mm_free(map->pool, q);
} else {
- map->free(map->baton, p);
+ mm_free(map->pool, p);
}
}
static cb_data_t *cbt_make_data(map_t *map, const uint8_t *str, size_t len, void *value)
{
- cb_data_t *x = map->malloc(map->baton, sizeof(cb_data_t) + len);
+ cb_data_t *x = mm_alloc(map->pool, sizeof(cb_data_t) + len);
if (x != NULL) {
x->value = value;
memcpy(x->key, str, len);
return 0;
}
-/*! Creates a new, empty critbit map */
-EXPORT map_t map_make(void)
-{
- map_t map;
- map.root = NULL;
- map.malloc = &malloc_std;
- map.free = &free_std;
- map.baton = NULL;
- return map;
-}
-
/*! Returns non-zero if map contains str */
EXPORT int map_contains(map_t *map, const char *str)
{
c = data->key[newbyte];
newdirection = (1 + (newotherbits | c)) >> 8;
- newnode = map->malloc(map->baton, sizeof(cb_node_t));
+ newnode = mm_alloc(map->pool, sizeof(cb_node_t));
if (newnode == NULL) {
return ENOMEM;
}
x = (uint8_t *)cbt_make_data(map, ubytes, ulen + 1, val);
if (x == NULL) {
- map->free(map->baton, newnode);
+ mm_free(map->pool, newnode);
return ENOMEM;
}
if (strcmp(str, (const char *)data->key) != 0) {
return 1;
}
- map->free(map->baton, p);
+ mm_free(map->pool, p);
if (!whereq) {
map->root = NULL;
}
*whereq = q->child[1 - direction];
- map->free(map->baton, q);
+ mm_free(map->pool, q);
return 0;
}
* # Example usage:
*
* @code{.c}
- * map_t map = map_make();
+ * map_t map = map_make(NULL);
*
* // Custom allocator (optional)
* map.malloc = &mymalloc;
extern "C" {
#endif
-typedef void *(*map_alloc_f)(void *, size_t);
-typedef void (*map_free_f)(void *baton, void *ptr);
+struct knot_mm; /* avoid the unnecessary include */
/** Main data structure */
typedef struct {
void *root;
- map_alloc_f malloc;
- map_free_f free;
- void *baton; /** Passed to malloc() and free() */
+ struct knot_mm *pool;
} map_t;
-/** Creates an new, empty critbit map */
-map_t map_make(void);
+/** Creates an new empty critbit map. Pass NULL for malloc+free. */
+static inline map_t map_make(struct knot_mm *pool)
+{
+ return (map_t){ .root = NULL, .pool = pool };
+}
/** Returns non-zero if map contains str */
int map_contains(map_t *map, const char *str);
* # Example usage:
*
* @code{.c}
- * set_t set = set_make();
+ * set_t set = set_make(NULL);
*
* // Insert keys
* if (set_add(&set, "princess") != 0 ||
typedef int (set_walk_cb)(const char *, void *);
/*! Creates an new, empty critbit set */
-#define set_make() \
- map_make()
+#define set_make \
+ map_make
/*! Returns non-zero if set contains str */
#define set_contains(set, str) \
cut->key = NULL;
cut->trust_anchor = NULL;
cut->parent = NULL;
- cut->nsset = map_make();
- cut->nsset.malloc = (map_alloc_f) mm_alloc;
- cut->nsset.free = (map_free_f) mm_free;
- cut->nsset.baton = pool;
+ cut->nsset = map_make(pool);
return kr_ok();
}
return kr_error(ENOMEM);
}
memset(data, 0, sizeof(*data));
- data->map = map_make();
+ data->map = map_make(NULL);
module->data = data;
lru_create(&data->queries.frequent, FREQUENT_COUNT, NULL, NULL);
/* Initialize ring buffer of recently visited upstreams */
static void test_init(void **state)
{
static map_t tree;
- tree = map_make();
+ tree = map_make(NULL);
*state = &tree;
assert_non_null(*state);
}
#include "tests/test.h"
#include "lib/generic/set.h"
+#include "lib/utils.h"
/*
static void *fake_malloc(void *b, size_t s) { return NULL; }
static void test_allocator(void **state)
{
- set_t set = set_make();
- set.malloc = fake_malloc;
+ knot_mm_t fake_pool = { .ctx = NULL, .alloc = fake_malloc, .free = NULL };
+ set_t set = set_make(&fake_pool);
assert_int_equal(set_add(&set, dict[0]), ENOMEM);
}
static void test_init(void **state)
{
static set_t set;
- set = set_make();
+ set = set_make(NULL);
*state = &set;
assert_non_null(*state);
}