Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/lib9p/hashtable.h
39475 views
1
/*
2
* Copyright 2016 Jakub Klama <[email protected]>
3
* All rights reserved
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted providing that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
18
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
22
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
23
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24
* POSSIBILITY OF SUCH DAMAGE.
25
*
26
*/
27
28
#ifndef LIB9P_HASHTABLE_H
29
#define LIB9P_HASHTABLE_H
30
31
#include <pthread.h>
32
#include <sys/queue.h>
33
34
struct ht {
35
struct ht_entry * ht_entries;
36
ssize_t ht_nentries;
37
pthread_rwlock_t ht_rwlock;
38
};
39
40
struct ht_entry {
41
TAILQ_HEAD(, ht_item) hte_items;
42
};
43
44
struct ht_item {
45
uint32_t hti_hash;
46
void * hti_data;
47
TAILQ_ENTRY(ht_item) hti_link;
48
};
49
50
struct ht_iter {
51
struct ht * htit_parent;
52
struct ht_item * htit_curr;
53
struct ht_item * htit_next;
54
ssize_t htit_slot;
55
};
56
57
#ifdef __clang__
58
#pragma clang diagnostic push
59
#pragma clang diagnostic ignored "-Wthread-safety-analysis"
60
#endif
61
62
/*
63
* Obtain read-lock on hash table.
64
*/
65
static inline int
66
ht_rdlock(struct ht *h)
67
{
68
69
return (pthread_rwlock_rdlock(&h->ht_rwlock));
70
}
71
72
/*
73
* Obtain write-lock on hash table.
74
*/
75
static inline int
76
ht_wrlock(struct ht *h)
77
{
78
79
return (pthread_rwlock_wrlock(&h->ht_rwlock));
80
}
81
82
/*
83
* Release lock on hash table.
84
*/
85
static inline int
86
ht_unlock(struct ht *h)
87
{
88
89
return (pthread_rwlock_unlock(&h->ht_rwlock));
90
}
91
92
#ifdef __clang__
93
#pragma clang diagnostic pop
94
#endif
95
96
void ht_init(struct ht *h, ssize_t size);
97
void ht_destroy(struct ht *h);
98
void *ht_find(struct ht *h, uint32_t hash);
99
void *ht_find_locked(struct ht *h, uint32_t hash);
100
int ht_add(struct ht *h, uint32_t hash, void *value);
101
int ht_remove(struct ht *h, uint32_t hash);
102
int ht_remove_locked(struct ht *h, uint32_t hash);
103
int ht_remove_at_iter(struct ht_iter *iter);
104
void ht_iter(struct ht *h, struct ht_iter *iter);
105
void *ht_next(struct ht_iter *iter);
106
107
#endif /* LIB9P_HASHTABLE_H */
108
109