1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
/*
* Copyright (c) 2020 Cisco and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* \file listener_table.c
* \brief Implementation of hICN listener table
*/
#include <hicn/util/log.h>
#include "listener_table.h"
#include "listener.h"
/* This is only used as a hint for first allocation, as the table is resizeable */
#define DEFAULT_LISTENER_TABLE_SIZE 64
listener_table_t *
_listener_table_create(size_t init_size, size_t max_size)
{
if (init_size == 0)
init_size = DEFAULT_LISTENER_TABLE_SIZE;
listener_table_t * table = malloc(sizeof(listener_table_t));
if (!table)
return NULL;
table->max_size = max_size;
/* Initialize indices */
table->id_by_name = kh_init_lt_name();
table->id_by_key = kh_init_lt_key();
/*
* We start by allocating a reasonably-sized pool, as this will eventually
* be resized if needed.
*/
pool_init(table->listeners, init_size, 0);
return table;
}
void
listener_table_free(listener_table_t * table)
{
kh_destroy_lt_name(table->id_by_name);
kh_destroy_lt_key(table->id_by_key);
pool_free(table->listeners);
free(table);
}
listener_t *
listener_table_get_by_address(listener_table_t * table,
face_type_t type, const address_t * address)
{
listener_key_t key;
//XXX
memset(&key, 0, sizeof(listener_key_t));
key = (listener_key_t) {
.type = type,
.address = *address,
};
khiter_t k = kh_get_lt_key(table->id_by_key, &key);
if (k == kh_end(table->id_by_key))
return NULL;
return listener_table_at(table, kh_val(table->id_by_key, k));
}
void
listener_table_remove_by_id(listener_table_t * table, off_t id)
{
/*
* Get the listener address so as to be able to remove it from the
* hash table index
*/
listener_t * listener = listener_table_at(table, id);
const char * name = listener_get_name(listener);
listener_key_t * key = listener_get_key(listener);
khiter_t k;
k = kh_get_lt_name(table->id_by_name, name);
kh_del_lt_name(table->id_by_name, k);
k = kh_get_lt_key(table->id_by_key, key);
kh_del_lt_key(table->id_by_key, k);
pool_put(table->listeners, listener);
}
listener_t *
listener_table_get_by_name(listener_table_t * table, const char * name)
{
khiter_t k = kh_get_lt_name(table->id_by_name, name);
if (k == kh_end(table->id_by_name))
return NULL;
return listener_table_at(table, kh_val(table->id_by_name, k));
}
listener_t *_listener_table_get_by_id(listener_table_t *table, off_t id) {
return listener_table_get_by_id(table, id);
}
void listener_table_print(const listener_table_t *table) {
const char *k;
unsigned v;
printf("*** Listener table ***\n");
kh_foreach(table->id_by_name, k, v, {
printf("%s:\t%u\n", k, v);
})
}
|