05c174228b6c8a5aa4d4fefaf1034ec4767f6638
[lttng-tools.git] / src / common / hashtable / hashtable.h
1 /*
2 * Copyright (C) 2011 - David Goulet <david.goulet@polymtl.ca>
3 *
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.
7 *
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
11 * more details.
12 *
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.
16 */
17
18 #ifndef _LTT_HT_H
19 #define _LTT_HT_H
20
21 #include <urcu.h>
22 #include <stdint.h>
23
24 #include "rculfhash.h"
25 #include "rculfhash-internal.h"
26 #include <common/macros.h>
27
28 extern unsigned long lttng_ht_seed;
29
30 typedef unsigned long (*hash_fct)(void *_key, unsigned long seed);
31 typedef cds_lfht_match_fct hash_match_fct;
32
33 enum lttng_ht_type {
34 LTTNG_HT_TYPE_STRING,
35 LTTNG_HT_TYPE_ULONG,
36 LTTNG_HT_TYPE_U64,
37 LTTNG_HT_TYPE_TWO_U64,
38 };
39
40 struct lttng_ht {
41 struct cds_lfht *ht;
42 cds_lfht_match_fct match_fct;
43 hash_fct hash_fct;
44 };
45
46 struct lttng_ht_iter {
47 struct cds_lfht_iter iter;
48 };
49
50 struct lttng_ht_node_str {
51 char *key;
52 struct cds_lfht_node node;
53 struct rcu_head head;
54 };
55
56 struct lttng_ht_node_ulong {
57 unsigned long key;
58 struct cds_lfht_node node;
59 struct rcu_head head;
60 };
61
62 struct lttng_ht_node_u64 {
63 uint64_t key;
64 struct cds_lfht_node node;
65 struct rcu_head head;
66 };
67
68 struct lttng_ht_two_u64 {
69 uint64_t key1;
70 uint64_t key2;
71 };
72
73 struct lttng_ht_node_two_u64 {
74 struct lttng_ht_two_u64 key;
75 struct cds_lfht_node node;
76 struct rcu_head head;
77 };
78
79 /* Hashtable new and destroy */
80 LTTNG_HIDDEN
81 struct lttng_ht *lttng_ht_new(unsigned long size, int type);
82 LTTNG_HIDDEN
83 void lttng_ht_destroy(struct lttng_ht *ht);
84
85 /* Specialized node init and free functions */
86 LTTNG_HIDDEN
87 void lttng_ht_node_init_str(struct lttng_ht_node_str *node, char *key);
88 LTTNG_HIDDEN
89 void lttng_ht_node_init_ulong(struct lttng_ht_node_ulong *node,
90 unsigned long key);
91 LTTNG_HIDDEN
92 void lttng_ht_node_init_u64(struct lttng_ht_node_u64 *node,
93 uint64_t key);
94 LTTNG_HIDDEN
95 void lttng_ht_node_init_two_u64(struct lttng_ht_node_two_u64 *node,
96 uint64_t key1, uint64_t key2);
97 LTTNG_HIDDEN
98 void lttng_ht_node_free_str(struct lttng_ht_node_str *node);
99 LTTNG_HIDDEN
100 void lttng_ht_node_free_ulong(struct lttng_ht_node_ulong *node);
101 LTTNG_HIDDEN
102 void lttng_ht_node_free_u64(struct lttng_ht_node_u64 *node);
103 LTTNG_HIDDEN
104 void lttng_ht_node_free_two_u64(struct lttng_ht_node_two_u64 *node);
105
106 LTTNG_HIDDEN
107 void lttng_ht_lookup(struct lttng_ht *ht, void *key,
108 struct lttng_ht_iter *iter);
109
110 /* Specialized add unique functions */
111 LTTNG_HIDDEN
112 void lttng_ht_add_unique_str(struct lttng_ht *ht,
113 struct lttng_ht_node_str *node);
114 LTTNG_HIDDEN
115 void lttng_ht_add_unique_ulong(struct lttng_ht *ht,
116 struct lttng_ht_node_ulong *node);
117 LTTNG_HIDDEN
118 void lttng_ht_add_unique_u64(struct lttng_ht *ht,
119 struct lttng_ht_node_u64 *node);
120 LTTNG_HIDDEN
121 void lttng_ht_add_unique_two_u64(struct lttng_ht *ht,
122 struct lttng_ht_node_two_u64 *node);
123 LTTNG_HIDDEN
124 struct lttng_ht_node_ulong *lttng_ht_add_replace_ulong(
125 struct lttng_ht *ht, struct lttng_ht_node_ulong *node);
126 LTTNG_HIDDEN
127 struct lttng_ht_node_u64 *lttng_ht_add_replace_u64(
128 struct lttng_ht *ht, struct lttng_ht_node_u64 *node);
129 LTTNG_HIDDEN
130 void lttng_ht_add_str(struct lttng_ht *ht,
131 struct lttng_ht_node_str *node);
132 LTTNG_HIDDEN
133 void lttng_ht_add_ulong(struct lttng_ht *ht,
134 struct lttng_ht_node_ulong *node);
135 LTTNG_HIDDEN
136 void lttng_ht_add_u64(struct lttng_ht *ht,
137 struct lttng_ht_node_u64 *node);
138
139 LTTNG_HIDDEN
140 int lttng_ht_del(struct lttng_ht *ht, struct lttng_ht_iter *iter);
141
142 LTTNG_HIDDEN
143 void lttng_ht_get_first(struct lttng_ht *ht,
144 struct lttng_ht_iter *iter);
145 LTTNG_HIDDEN
146 void lttng_ht_get_next(struct lttng_ht *ht, struct lttng_ht_iter *iter);
147
148 LTTNG_HIDDEN
149 unsigned long lttng_ht_get_count(struct lttng_ht *ht);
150
151 LTTNG_HIDDEN
152 struct lttng_ht_node_str *lttng_ht_iter_get_node_str(
153 struct lttng_ht_iter *iter);
154 LTTNG_HIDDEN
155 struct lttng_ht_node_ulong *lttng_ht_iter_get_node_ulong(
156 struct lttng_ht_iter *iter);
157 LTTNG_HIDDEN
158 struct lttng_ht_node_u64 *lttng_ht_iter_get_node_u64(
159 struct lttng_ht_iter *iter);
160 LTTNG_HIDDEN
161 struct lttng_ht_node_two_u64 *lttng_ht_iter_get_node_two_u64(
162 struct lttng_ht_iter *iter);
163
164 #endif /* _LTT_HT_H */
This page took 0.031303 seconds and 3 git commands to generate.