ckh.h revision 7427525c28d58c423a68930160e3b0fe577fe953
1/******************************************************************************/
2#ifdef JEMALLOC_H_TYPES
3
4typedef struct ckh_s ckh_t;
5typedef struct ckhc_s ckhc_t;
6
7/* Typedefs to allow easy function pointer passing. */
8typedef void ckh_hash_t (const void *, unsigned, size_t *, size_t *);
9typedef bool ckh_keycomp_t (const void *, const void *);
10
11/* Maintain counters used to get an idea of performance. */
12/* #define	CKH_COUNT */
13/* Print counter values in ckh_delete() (requires CKH_COUNT). */
14/* #define	CKH_VERBOSE */
15
16/*
17 * There are 2^LG_CKH_BUCKET_CELLS cells in each hash table bucket.  Try to fit
18 * one bucket per L1 cache line.
19 */
20#define LG_CKH_BUCKET_CELLS (LG_CACHELINE - LG_SIZEOF_PTR - 1)
21
22#endif /* JEMALLOC_H_TYPES */
23/******************************************************************************/
24#ifdef JEMALLOC_H_STRUCTS
25
26/* Hash table cell. */
27struct ckhc_s {
28	const void	*key;
29	const void	*data;
30};
31
32struct ckh_s {
33#ifdef JEMALLOC_DEBUG
34#define	CKH_MAGIC	0x3af2489d
35	uint32_t	magic;
36#endif
37
38#ifdef CKH_COUNT
39	/* Counters used to get an idea of performance. */
40	uint64_t	ngrows;
41	uint64_t	nshrinks;
42	uint64_t	nshrinkfails;
43	uint64_t	ninserts;
44	uint64_t	nrelocs;
45#endif
46
47	/* Used for pseudo-random number generation. */
48#define	CKH_A		1103515241
49#define	CKH_C		12347
50	uint32_t	prn_state;
51
52	/* Total number of items. */
53	size_t		count;
54
55	/*
56	 * Minimum and current number of hash table buckets.  There are
57	 * 2^LG_CKH_BUCKET_CELLS cells per bucket.
58	 */
59	unsigned	lg_minbuckets;
60	unsigned	lg_curbuckets;
61
62	/* Hash and comparison functions. */
63	ckh_hash_t	*hash;
64	ckh_keycomp_t	*keycomp;
65
66	/* Hash table with 2^lg_curbuckets buckets. */
67	ckhc_t		*tab;
68};
69
70#endif /* JEMALLOC_H_STRUCTS */
71/******************************************************************************/
72#ifdef JEMALLOC_H_EXTERNS
73
74bool	ckh_new(ckh_t *ckh, size_t minitems, ckh_hash_t *hash,
75    ckh_keycomp_t *keycomp);
76void	ckh_delete(ckh_t *ckh);
77size_t	ckh_count(ckh_t *ckh);
78bool	ckh_iter(ckh_t *ckh, size_t *tabind, void **key, void **data);
79bool	ckh_insert(ckh_t *ckh, const void *key, const void *data);
80bool	ckh_remove(ckh_t *ckh, const void *searchkey, void **key,
81    void **data);
82bool	ckh_search(ckh_t *ckh, const void *seachkey, void **key, void **data);
83void	ckh_string_hash(const void *key, unsigned minbits, size_t *hash1,
84    size_t *hash2);
85bool	ckh_string_keycomp(const void *k1, const void *k2);
86void	ckh_pointer_hash(const void *key, unsigned minbits, size_t *hash1,
87    size_t *hash2);
88bool	ckh_pointer_keycomp(const void *k1, const void *k2);
89
90#endif /* JEMALLOC_H_EXTERNS */
91/******************************************************************************/
92#ifdef JEMALLOC_H_INLINES
93
94#endif /* JEMALLOC_H_INLINES */
95/******************************************************************************/
96