2 * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
4 * SPDX-License-Identifier: GPL-2.0-only
14 #include <common/macros.h>
15 #include <urcu/rculfhash.h>
17 extern unsigned long lttng_ht_seed
;
19 typedef unsigned long (*hash_fct
)(const void *_key
, unsigned long seed
);
20 typedef cds_lfht_match_fct hash_match_fct
;
26 LTTNG_HT_TYPE_TWO_U64
,
31 cds_lfht_match_fct match_fct
;
35 struct lttng_ht_iter
{
36 struct cds_lfht_iter iter
;
39 struct lttng_ht_node_str
{
41 struct cds_lfht_node node
;
45 struct lttng_ht_node_ulong
{
47 struct cds_lfht_node node
;
51 struct lttng_ht_node_u64
{
53 struct cds_lfht_node node
;
57 struct lttng_ht_two_u64
{
62 struct lttng_ht_node_two_u64
{
63 struct lttng_ht_two_u64 key
;
64 struct cds_lfht_node node
;
68 /* Hashtable new and destroy */
69 struct lttng_ht
*lttng_ht_new(unsigned long size
, int type
);
70 void lttng_ht_destroy(struct lttng_ht
*ht
);
72 /* Specialized node init and free functions */
73 void lttng_ht_node_init_str(struct lttng_ht_node_str
*node
, char *key
);
74 void lttng_ht_node_init_ulong(struct lttng_ht_node_ulong
*node
,
76 void lttng_ht_node_init_u64(struct lttng_ht_node_u64
*node
,
78 void lttng_ht_node_init_two_u64(struct lttng_ht_node_two_u64
*node
,
79 uint64_t key1
, uint64_t key2
);
80 void lttng_ht_node_free_str(struct lttng_ht_node_str
*node
);
81 void lttng_ht_node_free_ulong(struct lttng_ht_node_ulong
*node
);
82 void lttng_ht_node_free_u64(struct lttng_ht_node_u64
*node
);
83 void lttng_ht_node_free_two_u64(struct lttng_ht_node_two_u64
*node
);
85 void lttng_ht_lookup(struct lttng_ht
*ht
, const void *key
,
86 struct lttng_ht_iter
*iter
);
88 /* Specialized add unique functions */
89 void lttng_ht_add_unique_str(struct lttng_ht
*ht
,
90 struct lttng_ht_node_str
*node
);
91 void lttng_ht_add_unique_ulong(struct lttng_ht
*ht
,
92 struct lttng_ht_node_ulong
*node
);
93 void lttng_ht_add_unique_u64(struct lttng_ht
*ht
,
94 struct lttng_ht_node_u64
*node
);
95 void lttng_ht_add_unique_two_u64(struct lttng_ht
*ht
,
96 struct lttng_ht_node_two_u64
*node
);
97 struct lttng_ht_node_ulong
*lttng_ht_add_replace_ulong(
98 struct lttng_ht
*ht
, struct lttng_ht_node_ulong
*node
);
99 struct lttng_ht_node_u64
*lttng_ht_add_replace_u64(
100 struct lttng_ht
*ht
, struct lttng_ht_node_u64
*node
);
101 void lttng_ht_add_str(struct lttng_ht
*ht
,
102 struct lttng_ht_node_str
*node
);
103 void lttng_ht_add_ulong(struct lttng_ht
*ht
,
104 struct lttng_ht_node_ulong
*node
);
105 void lttng_ht_add_u64(struct lttng_ht
*ht
,
106 struct lttng_ht_node_u64
*node
);
108 int lttng_ht_del(struct lttng_ht
*ht
, struct lttng_ht_iter
*iter
);
110 void lttng_ht_get_first(struct lttng_ht
*ht
,
111 struct lttng_ht_iter
*iter
);
112 void lttng_ht_get_next(struct lttng_ht
*ht
, struct lttng_ht_iter
*iter
);
114 unsigned long lttng_ht_get_count(struct lttng_ht
*ht
);
116 struct lttng_ht_node_str
*lttng_ht_iter_get_node_str(
117 struct lttng_ht_iter
*iter
);
118 struct lttng_ht_node_ulong
*lttng_ht_iter_get_node_ulong(
119 struct lttng_ht_iter
*iter
);
120 struct lttng_ht_node_u64
*lttng_ht_iter_get_node_u64(
121 struct lttng_ht_iter
*iter
);
122 struct lttng_ht_node_two_u64
*lttng_ht_iter_get_node_two_u64(
123 struct lttng_ht_iter
*iter
);
125 #endif /* _LTT_HT_H */