-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdmap-hash.h
53 lines (39 loc) · 1.29 KB
/
dmap-hash.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#ifndef __DMAP_HASH_H__
#define __DMAP_HASH_H__
#include "dmap-const.h"
#include <linux/rbtree.h>
#include <linux/rwlock.h>
#define DMAP_HASH_SIZE 32768
struct dmap_hash_node {
struct rb_node link;
unsigned char *key;
size_t key_len;
unsigned char *value;
size_t value_len;
atomic_t ref_count;
bool in_tree;
rwlock_t lock;
};
struct dmap_hash_bucket {
struct rb_root tree;
rwlock_t lock;
};
struct dmap_hash {
struct dmap_hash_bucket bucket[DMAP_HASH_SIZE];
atomic64_t nr_keys;
};
void dmap_hash_init(struct dmap_hash *hash);
void dmap_hash_deinit(struct dmap_hash *hash);
int dmap_hash_insert(struct dmap_hash *hash, unsigned char *key, size_t key_len,
unsigned char *value, size_t value_len);
int dmap_hash_update(struct dmap_hash *hash, unsigned char *key, size_t key_len,
unsigned char *value, size_t value_len);
int dmap_hash_cmpxchg(struct dmap_hash *hash, unsigned char *key,
size_t key_len, unsigned char *exchange, size_t exchange_len,
unsigned char *comparand, size_t comparand_len,
unsigned char *value, size_t value_len, size_t *pvalue_len);
int dmap_hash_get(struct dmap_hash *hash, unsigned char *key, size_t key_len,
unsigned char *value, size_t value_len, size_t *pvalue_len);
int dmap_hash_delete(struct dmap_hash *hash, unsigned char *key,
size_t key_len);
#endif