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 <lttng/lttng-export.h>
16 #include <urcu/rculfhash.h>
22 LTTNG_EXPORT
extern unsigned long lttng_ht_seed
;
24 typedef unsigned long (*hash_fct_type
)(const void *_key
, unsigned long seed
);
25 typedef cds_lfht_match_fct hash_match_fct
;
31 LTTNG_HT_TYPE_TWO_U64
,
36 cds_lfht_match_fct match_fct
;
37 hash_fct_type hash_fct
;
40 struct lttng_ht_iter
{
41 struct cds_lfht_iter iter
;
44 struct lttng_ht_node_str
{
46 struct cds_lfht_node node
;
50 struct lttng_ht_node_ulong
{
52 struct cds_lfht_node node
;
56 struct lttng_ht_node_u64
{
58 struct cds_lfht_node node
;
62 struct lttng_ht_two_u64
{
67 struct lttng_ht_node_two_u64
{
68 struct lttng_ht_two_u64 key
;
69 struct cds_lfht_node node
;
73 /* Hashtable new and destroy */
74 struct lttng_ht
*lttng_ht_new(unsigned long size
, int type
);
75 void lttng_ht_destroy(struct lttng_ht
*ht
);
77 /* Specialized node init and free functions */
78 void lttng_ht_node_init_str(struct lttng_ht_node_str
*node
, char *key
);
79 void lttng_ht_node_init_ulong(struct lttng_ht_node_ulong
*node
,
81 void lttng_ht_node_init_u64(struct lttng_ht_node_u64
*node
,
83 void lttng_ht_node_init_two_u64(struct lttng_ht_node_two_u64
*node
,
84 uint64_t key1
, uint64_t key2
);
85 void lttng_ht_node_free_str(struct lttng_ht_node_str
*node
);
86 void lttng_ht_node_free_ulong(struct lttng_ht_node_ulong
*node
);
87 void lttng_ht_node_free_u64(struct lttng_ht_node_u64
*node
);
88 void lttng_ht_node_free_two_u64(struct lttng_ht_node_two_u64
*node
);
90 void lttng_ht_lookup(struct lttng_ht
*ht
, const void *key
,
91 struct lttng_ht_iter
*iter
);
93 /* Specialized add unique functions */
94 void lttng_ht_add_unique_str(struct lttng_ht
*ht
,
95 struct lttng_ht_node_str
*node
);
96 void lttng_ht_add_unique_ulong(struct lttng_ht
*ht
,
97 struct lttng_ht_node_ulong
*node
);
98 void lttng_ht_add_unique_u64(struct lttng_ht
*ht
,
99 struct lttng_ht_node_u64
*node
);
100 void lttng_ht_add_unique_two_u64(struct lttng_ht
*ht
,
101 struct lttng_ht_node_two_u64
*node
);
102 struct lttng_ht_node_ulong
*lttng_ht_add_replace_ulong(
103 struct lttng_ht
*ht
, struct lttng_ht_node_ulong
*node
);
104 struct lttng_ht_node_u64
*lttng_ht_add_replace_u64(
105 struct lttng_ht
*ht
, struct lttng_ht_node_u64
*node
);
106 void lttng_ht_add_str(struct lttng_ht
*ht
,
107 struct lttng_ht_node_str
*node
);
108 void lttng_ht_add_ulong(struct lttng_ht
*ht
,
109 struct lttng_ht_node_ulong
*node
);
110 void lttng_ht_add_u64(struct lttng_ht
*ht
,
111 struct lttng_ht_node_u64
*node
);
113 int lttng_ht_del(struct lttng_ht
*ht
, struct lttng_ht_iter
*iter
);
115 void lttng_ht_get_first(struct lttng_ht
*ht
,
116 struct lttng_ht_iter
*iter
);
117 void lttng_ht_get_next(struct lttng_ht
*ht
, struct lttng_ht_iter
*iter
);
119 unsigned long lttng_ht_get_count(struct lttng_ht
*ht
);
121 struct lttng_ht_node_str
*lttng_ht_iter_get_node_str(
122 struct lttng_ht_iter
*iter
);
123 struct lttng_ht_node_ulong
*lttng_ht_iter_get_node_ulong(
124 struct lttng_ht_iter
*iter
);
125 struct lttng_ht_node_u64
*lttng_ht_iter_get_node_u64(
126 struct lttng_ht_iter
*iter
);
127 struct lttng_ht_node_two_u64
*lttng_ht_iter_get_node_two_u64(
128 struct lttng_ht_iter
*iter
);
134 #endif /* _LTT_HT_H */