2 * Copyright (C) 2011 - David Goulet <david.goulet@polymtl.ca>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License, version 2 only,
6 * as published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 #include <urcu/compiler.h>
24 #include <common/common.h>
25 #include <common/defaults.h>
27 #include "hashtable.h"
30 unsigned long lttng_ht_seed
;
32 static unsigned long min_hash_alloc_size
= 1;
33 static unsigned long max_hash_buckets_size
= 0;
36 * Match function for string node.
38 static int match_str(struct cds_lfht_node
*node
, const void *key
)
40 struct lttng_ht_node_str
*match_node
=
41 caa_container_of(node
, struct lttng_ht_node_str
, node
);
43 return hash_match_key_str(match_node
->key
, (void *) key
);
47 * Match function for ulong node.
49 static int match_ulong(struct cds_lfht_node
*node
, const void *key
)
51 struct lttng_ht_node_ulong
*match_node
=
52 caa_container_of(node
, struct lttng_ht_node_ulong
, node
);
54 return hash_match_key_ulong((void *) match_node
->key
, (void *) key
);
58 * Match function for u64 node.
60 static int match_u64(struct cds_lfht_node
*node
, const void *key
)
62 struct lttng_ht_node_u64
*match_node
=
63 caa_container_of(node
, struct lttng_ht_node_u64
, node
);
65 return hash_match_key_u64(&match_node
->key
, (void *) key
);
69 * Return an allocated lttng hashtable.
71 struct lttng_ht
*lttng_ht_new(unsigned long size
, int type
)
77 size
= DEFAULT_HT_SIZE
;
79 ht
= zmalloc(sizeof(*ht
));
81 PERROR("zmalloc lttng_ht");
85 ht
->ht
= cds_lfht_new(size
, min_hash_alloc_size
, max_hash_buckets_size
,
86 CDS_LFHT_AUTO_RESIZE
| CDS_LFHT_ACCOUNTING
, NULL
);
88 * There is already an assert in the RCU hashtable code so if the ht is
89 * NULL here there is a *huge* problem.
94 case LTTNG_HT_TYPE_STRING
:
95 ht
->match_fct
= match_str
;
96 ht
->hash_fct
= hash_key_str
;
98 case LTTNG_HT_TYPE_ULONG
:
99 ht
->match_fct
= match_ulong
;
100 ht
->hash_fct
= hash_key_ulong
;
102 case LTTNG_HT_TYPE_U64
:
103 ht
->match_fct
= match_u64
;
104 ht
->hash_fct
= hash_key_u64
;
107 ERR("Unknown lttng hashtable type %d", type
);
108 lttng_ht_destroy(ht
);
112 DBG3("Created hashtable size %lu at %p of type %d", size
, ht
->ht
, type
);
121 * Free a lttng hashtable.
123 void lttng_ht_destroy(struct lttng_ht
*ht
)
127 ret
= cds_lfht_destroy(ht
->ht
, NULL
);
133 * Init lttng ht node string.
135 void lttng_ht_node_init_str(struct lttng_ht_node_str
*node
, char *key
)
140 cds_lfht_node_init(&node
->node
);
144 * Init lttng ht node unsigned long.
146 void lttng_ht_node_init_ulong(struct lttng_ht_node_ulong
*node
,
152 cds_lfht_node_init(&node
->node
);
156 * Init lttng ht node uint64_t.
158 void lttng_ht_node_init_u64(struct lttng_ht_node_u64
*node
,
164 cds_lfht_node_init(&node
->node
);
168 * Free lttng ht node string.
170 void lttng_ht_node_free_str(struct lttng_ht_node_str
*node
)
177 * Free lttng ht node unsigned long.
179 void lttng_ht_node_free_ulong(struct lttng_ht_node_ulong
*node
)
186 * Free lttng ht node uint64_t.
188 void lttng_ht_node_free_u64(struct lttng_ht_node_u64
*node
)
195 * Lookup function in hashtable.
197 void lttng_ht_lookup(struct lttng_ht
*ht
, void *key
,
198 struct lttng_ht_iter
*iter
)
203 cds_lfht_lookup(ht
->ht
, ht
->hash_fct(key
, lttng_ht_seed
),
204 ht
->match_fct
, key
, &iter
->iter
);
208 * Add unique string node to hashtable.
210 void lttng_ht_add_unique_str(struct lttng_ht
*ht
,
211 struct lttng_ht_node_str
*node
)
213 struct cds_lfht_node
*node_ptr
;
218 node_ptr
= cds_lfht_add_unique(ht
->ht
, ht
->hash_fct(node
->key
, lttng_ht_seed
),
219 ht
->match_fct
, node
->key
, &node
->node
);
220 assert(node_ptr
== &node
->node
);
224 * Add unsigned long node to hashtable.
226 void lttng_ht_add_ulong(struct lttng_ht
*ht
, struct lttng_ht_node_ulong
*node
)
232 cds_lfht_add(ht
->ht
, ht
->hash_fct((void *) node
->key
, lttng_ht_seed
),
237 * Add uint64_t node to hashtable.
240 void lttng_ht_add_u64(struct lttng_ht
*ht
, struct lttng_ht_node_u64
*node
)
246 cds_lfht_add(ht
->ht
, ht
->hash_fct(&node
->key
, lttng_ht_seed
),
251 * Add unique unsigned long node to hashtable.
253 void lttng_ht_add_unique_ulong(struct lttng_ht
*ht
,
254 struct lttng_ht_node_ulong
*node
)
256 struct cds_lfht_node
*node_ptr
;
261 node_ptr
= cds_lfht_add_unique(ht
->ht
,
262 ht
->hash_fct((void *) node
->key
, lttng_ht_seed
), ht
->match_fct
,
263 (void *) node
->key
, &node
->node
);
264 assert(node_ptr
== &node
->node
);
268 * Add unique uint64_t node to hashtable.
270 void lttng_ht_add_unique_u64(struct lttng_ht
*ht
,
271 struct lttng_ht_node_u64
*node
)
273 struct cds_lfht_node
*node_ptr
;
278 node_ptr
= cds_lfht_add_unique(ht
->ht
,
279 ht
->hash_fct(&node
->key
, lttng_ht_seed
), ht
->match_fct
,
280 &node
->key
, &node
->node
);
281 assert(node_ptr
== &node
->node
);
285 * Add replace unsigned long node to hashtable.
287 struct lttng_ht_node_ulong
*lttng_ht_add_replace_ulong(struct lttng_ht
*ht
,
288 struct lttng_ht_node_ulong
*node
)
290 struct cds_lfht_node
*node_ptr
;
295 node_ptr
= cds_lfht_add_replace(ht
->ht
,
296 ht
->hash_fct((void *) node
->key
, lttng_ht_seed
), ht
->match_fct
,
297 (void *) node
->key
, &node
->node
);
301 return caa_container_of(node_ptr
, struct lttng_ht_node_ulong
, node
);
303 assert(node_ptr
== &node
->node
);
307 * Add replace unsigned long node to hashtable.
309 struct lttng_ht_node_u64
*lttng_ht_add_replace_u64(struct lttng_ht
*ht
,
310 struct lttng_ht_node_u64
*node
)
312 struct cds_lfht_node
*node_ptr
;
317 node_ptr
= cds_lfht_add_replace(ht
->ht
,
318 ht
->hash_fct(&node
->key
, lttng_ht_seed
), ht
->match_fct
,
319 &node
->key
, &node
->node
);
323 return caa_container_of(node_ptr
, struct lttng_ht_node_u64
, node
);
325 assert(node_ptr
== &node
->node
);
329 * Delete node from hashtable.
331 int lttng_ht_del(struct lttng_ht
*ht
, struct lttng_ht_iter
*iter
)
337 return cds_lfht_del(ht
->ht
, iter
->iter
.node
);
341 * Get first node in the hashtable.
343 void lttng_ht_get_first(struct lttng_ht
*ht
, struct lttng_ht_iter
*iter
)
349 cds_lfht_first(ht
->ht
, &iter
->iter
);
353 * Get next node in the hashtable.
355 void lttng_ht_get_next(struct lttng_ht
*ht
, struct lttng_ht_iter
*iter
)
361 cds_lfht_next(ht
->ht
, &iter
->iter
);
365 * Return the number of nodes in the hashtable.
367 unsigned long lttng_ht_get_count(struct lttng_ht
*ht
)
375 cds_lfht_count_nodes(ht
->ht
, &scb
, &count
, &sca
);
381 * Return lttng ht string node from iterator.
383 struct lttng_ht_node_str
*lttng_ht_iter_get_node_str(
384 struct lttng_ht_iter
*iter
)
386 struct cds_lfht_node
*node
;
389 node
= cds_lfht_iter_get_node(&iter
->iter
);
393 return caa_container_of(node
, struct lttng_ht_node_str
, node
);
397 * Return lttng ht unsigned long node from iterator.
399 struct lttng_ht_node_ulong
*lttng_ht_iter_get_node_ulong(
400 struct lttng_ht_iter
*iter
)
402 struct cds_lfht_node
*node
;
405 node
= cds_lfht_iter_get_node(&iter
->iter
);
409 return caa_container_of(node
, struct lttng_ht_node_ulong
, node
);
413 * Return lttng ht unsigned long node from iterator.
415 struct lttng_ht_node_u64
*lttng_ht_iter_get_node_u64(
416 struct lttng_ht_iter
*iter
)
418 struct cds_lfht_node
*node
;
421 node
= cds_lfht_iter_get_node(&iter
->iter
);
425 return caa_container_of(node
, struct lttng_ht_node_u64
, node
);
431 static void __attribute__((constructor
)) _init(void)
433 /* Init hash table seed */
434 lttng_ht_seed
= (unsigned long) time(NULL
);
This page took 0.046993 seconds and 4 git commands to generate.