aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-light/src/hicn/core/connection_table.c
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-light/src/hicn/core/connection_table.c')
-rw-r--r--hicn-light/src/hicn/core/connection_table.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/hicn-light/src/hicn/core/connection_table.c b/hicn-light/src/hicn/core/connection_table.c
index 7bc0e2f4c..a6b114c01 100644
--- a/hicn-light/src/hicn/core/connection_table.c
+++ b/hicn-light/src/hicn/core/connection_table.c
@@ -19,6 +19,7 @@
*/
#include <hicn/util/log.h>
+#include <hicn/util/sstrncpy.h>
#include "connection.h"
#include "connection_table.h"
@@ -27,6 +28,10 @@
*/
#define DEFAULT_CONNECTION_TABLE_SIZE 64
+typedef struct {
+ char name[SYMBOLIC_NAME_LEN];
+} name_key_t;
+
connection_table_t *_connection_table_create(size_t init_size,
size_t max_size) {
if (init_size == 0) init_size = DEFAULT_CONNECTION_TABLE_SIZE;
@@ -38,7 +43,9 @@ connection_table_t *_connection_table_create(size_t init_size,
/* Initialize indices */
table->id_by_pair = kh_init_ct_pair();
+ table->pair_keys = slab_create(address_pair_t, SLAB_INIT_SIZE);
table->id_by_name = kh_init_ct_name();
+ table->name_keys = slab_create(name_key_t, SLAB_INIT_SIZE);
/*
* We start by allocating a reasonably-sized pool, as this will eventually
@@ -50,26 +57,20 @@ connection_table_t *_connection_table_create(size_t init_size,
}
void connection_table_free(connection_table_t *table) {
- const char *k_name;
- const address_pair_t *k_pair;
- unsigned v_conn_id;
+ unsigned conn_id;
+ kh_foreach_value(table->id_by_name, conn_id, {
+ connection_t *connection = connection_table_get_by_id(table, conn_id);
+ const char *name = connection_get_name(connection);
- connection_t *connection;
- const char *name;
- kh_foreach(table->id_by_name, k_name, v_conn_id, {
- connection = connection_table_get_by_id(table, v_conn_id);
- name = connection_get_name(connection);
INFO("Removing connection %s [%d]", name, connection->fd);
connection_finalize(connection);
});
- (void)v_conn_id;
- kh_foreach(table->id_by_name, k_name, v_conn_id, { free((char *)k_name); });
- kh_foreach(table->id_by_pair, k_pair, v_conn_id,
- { free((address_pair_t *)k_pair); });
-
kh_destroy_ct_pair(table->id_by_pair);
+ slab_free(table->pair_keys);
kh_destroy_ct_name(table->id_by_name);
+ slab_free(table->name_keys);
+
pool_free(table->connections);
free(table);
}
@@ -93,12 +94,15 @@ connection_t *connection_table_allocate(const connection_table_t *table,
int rc;
// Add in name hash table
- khiter_t k = kh_put_ct_name(table->id_by_name, strdup(name), &rc);
+ name_key_t *name_copy = slab_get(name_key_t, table->name_keys);
+ strcpy_s(name_copy->name, sizeof(name_key_t), name);
+
+ khiter_t k = kh_put_ct_name(table->id_by_name, name_copy->name, &rc);
assert(rc == KH_ADDED || rc == KH_RESET);
kh_value(table->id_by_name, k) = (unsigned int)id;
// Add in pair hash table
- address_pair_t *pair_copy = (address_pair_t *)malloc(sizeof(address_pair_t));
+ address_pair_t *pair_copy = slab_get(address_pair_t, table->pair_keys);
memcpy(pair_copy, pair, sizeof(address_pair_t));
k = kh_put_ct_pair(table->id_by_pair, pair_copy, &rc);
@@ -125,14 +129,14 @@ void connection_table_deallocate(const connection_table_t *table,
// Remove from name hash table
khiter_t k = kh_get_ct_name(table->id_by_name, name);
assert(k != kh_end(table->id_by_name));
- free((char *)kh_key(table->id_by_name, k));
kh_del_ct_name(table->id_by_name, k);
+ slab_put(table->name_keys, kh_key(table->id_by_name, k));
// Remove from pair hash table
k = kh_get_ct_pair(table->id_by_pair, pair);
assert(k != kh_end(table->id_by_pair));
- free((address_pair_t *)kh_key(table->id_by_pair, k));
kh_del_ct_pair(table->id_by_pair, k);
+ slab_put(table->pair_keys, kh_key(table->id_by_pair, k));
assert(kh_size(table->id_by_name) == kh_size(table->id_by_pair));
pool_put(table->connections, conn);