CUBRID Engine  latest
memory_hash.h
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 
20 /*
21  * memory_hash.h - memory hash table
22  */
23 
24 #ifndef _MEMORY_HASH_H_
25 #define _MEMORY_HASH_H_
26 
27 #ident "$Id$"
28 
29 #include "dbtype_def.h"
30 #include "memory_alloc.h"
31 #include "thread_compat.hpp"
32 
33 #include <stdio.h>
34 
35 
36 #define MHT2STR_COLL(id, str, size) \
37  (lang_get_collation (id))->mht2str ((lang_get_collation (id)), (str), (size))
38 
39 /* Hash Table Entry - linked list */
40 typedef struct hentry HENTRY;
41 typedef struct hentry *HENTRY_PTR;
42 struct hentry
43 {
44  HENTRY_PTR act_next; /* Next active entry on hash table */
45  HENTRY_PTR act_prev; /* Previous active entry on hash table */
46  HENTRY_PTR lru_next; /* least recentry used list next item */
47  HENTRY_PTR lru_prev; /* least recentry used list prev item */
48  HENTRY_PTR next; /* Next hash table entry for colisions */
49  const void *key; /* Key associated with entry */
50  void *data; /* Data associated with key entry */
51 };
52 
53 /* Memory Hash Table */
54 typedef struct mht_table MHT_TABLE;
55 struct mht_table
56 {
57  unsigned int (*hash_func) (const void *key, unsigned int htsize);
58  int (*cmp_func) (const void *key1, const void *key2);
59  const char *name;
60  HENTRY_PTR *table; /* The hash table (entries) */
61  HENTRY_PTR act_head; /* Head of active double link list entries. Used to perform quick mappings of hash
62  * table. */
63  HENTRY_PTR act_tail; /* Tail of active double link list entries. Used to perform quick mappings of hash
64  * table. */
65  HENTRY_PTR lru_head; /* least recently used head */
66  HENTRY_PTR lru_tail; /* least recently used tail */
67  HENTRY_PTR prealloc_entries; /* Free entries allocated for locality reasons */
68  unsigned int size; /* Better if prime number */
69  unsigned int rehash_at; /* Rehash at this num of entries */
70  unsigned int nentries; /* Actual number of entries */
71  unsigned int nprealloc_entries; /* Number of preallocated entries for future insertions */
72  unsigned int ncollisions; /* Number of collisions in HT */
73  HL_HEAPID heap_id; /* Id of heap allocator */
74  bool build_lru_list; /* true if LRU list must be built */
75 };
76 
77 extern unsigned int mht_2str_pseudo_key (const void *key, int key_size);
78 extern unsigned int mht_1strlowerhash (const void *key, const unsigned int ht_size);
79 extern unsigned int mht_1strhash (const void *key, const unsigned int ht_size);
80 extern unsigned int mht_2strhash (const void *key, const unsigned int ht_size);
81 extern unsigned int mht_3strhash (const void *key, const unsigned int ht_size);
82 extern unsigned int mht_4strhash (const void *key, const unsigned int ht_size);
83 extern unsigned int mht_5strhash (const void *key, const unsigned int ht_size);
84 extern unsigned int mht_numhash (const void *key, const unsigned int ht_size);
85 
86 extern unsigned int mht_get_hash_number (const int ht_size, const DB_VALUE * val);
87 extern unsigned int mht_ptrhash (const void *ptr, const unsigned int ht_size);
88 extern unsigned int mht_valhash (const void *key, const unsigned int ht_size);
89 extern int mht_compare_identifiers_equal (const void *key1, const void *key2);
90 extern int mht_compare_strings_are_equal (const void *key1, const void *key2);
91 extern int mht_compare_ints_are_equal (const void *key1, const void *key2);
92 extern int mht_compare_logpageids_are_equal (const void *key1, const void *key2);
93 extern int mht_compare_ptrs_are_equal (const void *key1, const void *key2);
94 extern int mht_compare_dbvalues_are_equal (const void *key1, const void *key2);
95 
96 extern MHT_TABLE *mht_create (const char *name, int est_size,
97  unsigned int (*hash_func) (const void *key, unsigned int ht_size),
98  int (*cmp_func) (const void *key1, const void *key2));
99 extern void mht_destroy (MHT_TABLE * ht);
100 extern int mht_clear (MHT_TABLE * ht, int (*rem_func) (const void *key, void *data, void *args), void *func_args);
101 extern void *mht_get (MHT_TABLE * ht, const void *key);
102 extern void *mht_get2 (const MHT_TABLE * ht, const void *key, void **last);
103 extern const void *mht_put (MHT_TABLE * ht, const void *key, void *data);
104 extern const void *mht_put_data (MHT_TABLE * ht, const void *key, void *data);
105 extern const void *mht_put_new (MHT_TABLE * ht, const void *key, void *data);
106 extern const void *mht_put_if_not_exists (MHT_TABLE * ht, const void *key, void *data);
107 #if defined (ENABLE_UNUSED_FUNCTION)
108 extern const void *mht_put2 (MHT_TABLE * ht, const void *key, void *data);
109 extern const void *mht_put2_data (MHT_TABLE * ht, const void *key, void *data);
110 #endif
111 extern const void *mht_put2_new (MHT_TABLE * ht, const void *key, void *data);
112 extern int mht_rem (MHT_TABLE * ht, const void *key, int (*rem_func) (const void *key, void *data, void *args),
113  void *func_args);
114 extern int mht_rem2 (MHT_TABLE * ht, const void *key, const void *data,
115  int (*rem_func) (const void *key, void *data, void *args), void *func_args);
116 extern int mht_map (const MHT_TABLE * ht, int (*map_func) (const void *key, void *data, void *args), void *func_args);
117 extern int mht_map_no_key (THREAD_ENTRY * thread_p, const MHT_TABLE * ht,
118  int (*map_func) (THREAD_ENTRY * thread_p, void *data, void *args), void *func_args);
119 extern int mht_adjust_lru_list (MHT_TABLE * ht, HENTRY_PTR hentry);
120 extern unsigned int mht_count (const MHT_TABLE * ht);
121 extern int mht_dump (THREAD_ENTRY * thread_p, FILE * out_fp, const MHT_TABLE * ht, const int print_id_opt,
122  int (*print_func) (THREAD_ENTRY * thread_p, FILE * fp, const void *key, void *data, void *args),
123  void *func_args);
124 
125 /*
126  * Hash table for HASH LIST SCAN
127  * In order to minimize the size of the hash entry, a hash table for HASH LIST SCAN is created separately.
128  * It has the following features.
129  * 1. lru, act is not used. (remove variable related to lru, act)
130  * 2. key comparison is performed in executor. (remove key of hash entry)
131  * 3. put data orderly. (add tail pointer for it)
132  * 4. Since hash size is fixed, rehashing the hash table is not necessary.
133  */
134 
135 /* Hash Table Entry for HASH LIST SCAN - linked list, keyless hash entry */
136 typedef struct hentry_hls HENTRY_HLS;
137 typedef struct hentry_hls *HENTRY_HLS_PTR;
139 {
140  HENTRY_HLS_PTR tail; /* tail node on hash table entry */
141  HENTRY_HLS_PTR next; /* Next hash table entry for colisions */
142  void *data; /* Data associated with key entry */
143 };
144 
145 /* Memory Hash Table for HASH LIST SCAN*/
148 {
149  unsigned int (*hash_func) (const void *key, unsigned int htsize);
150  int (*cmp_func) (const void *key1, const void *key2);
151  const char *name;
152  HENTRY_HLS_PTR *table; /* The hash table (entries) */
153  HENTRY_HLS_PTR prealloc_entries; /* Free entries allocated for locality reasons */
154  unsigned int size; /* Better if prime number */
155  unsigned int nentries; /* Actual number of entries */
156  unsigned int nprealloc_entries; /* Number of preallocated entries for future insertions */
157  unsigned int ncollisions; /* Number of collisions in HT */
158  HL_HEAPID heap_id; /* Id of heap allocator */
159  bool build_lru_list; /* true if LRU list must be built */
160 };
161 
162 extern const void *mht_put_hls (MHT_HLS_TABLE * ht, const void *key, void *data);
163 extern void *mht_get_hls (const MHT_HLS_TABLE * ht, const void *key, void **last);
164 extern MHT_HLS_TABLE *mht_create_hls (const char *name, int est_size,
165  unsigned int (*hash_func) (const void *key, unsigned int ht_size),
166  int (*cmp_func) (const void *key1, const void *key2));
167 extern int mht_clear_hls (MHT_HLS_TABLE * ht, int (*rem_func) (const void *key, void *data, void *args), void *func_args);
168 extern void mht_destroy_hls (MHT_HLS_TABLE * ht);
169 extern int mht_dump_hls (THREAD_ENTRY * thread_p, FILE * out_fp, const MHT_HLS_TABLE * ht, const int print_id_opt,
170  int (*print_func) (THREAD_ENTRY * thread_p, FILE * fp, const void *data, void *args),
171  void *func_args);
172 /* for HASH LIST SCAN (end) */
173 
174 #endif /* _MEMORY_HASH_H_ */
HENTRY_PTR act_next
Definition: memory_hash.h:44
const void * mht_put_if_not_exists(MHT_TABLE *ht, const void *key, void *data)
Definition: memory_hash.c:1749
unsigned int mht_1strhash(const void *key, const unsigned int ht_size)
Definition: memory_hash.c:447
unsigned int nprealloc_entries
Definition: memory_hash.h:156
void mht_destroy(MHT_TABLE *ht)
Definition: memory_hash.c:1140
HENTRY_PTR lru_next
Definition: memory_hash.h:46
int mht_compare_dbvalues_are_equal(const void *key1, const void *key2)
Definition: memory_hash.c:791
int mht_compare_ptrs_are_equal(const void *key1, const void *key2)
Definition: memory_hash.c:779
void * mht_get2(const MHT_TABLE *ht, const void *key, void **last)
Definition: memory_hash.c:1496
unsigned int mht_2str_pseudo_key(const void *key, int key_size)
Definition: memory_hash.c:175
unsigned int mht_2strhash(const void *key, const unsigned int ht_size)
Definition: memory_hash.c:466
unsigned int rehash_at
Definition: memory_hash.h:69
bool build_lru_list
Definition: memory_hash.h:159
HL_HEAPID heap_id
Definition: memory_hash.h:158
unsigned int nprealloc_entries
Definition: memory_hash.h:71
unsigned int size
Definition: memory_hash.h:154
HL_HEAPID heap_id
Definition: memory_hash.h:73
void THREAD_ENTRY
bool build_lru_list
Definition: memory_hash.h:74
unsigned int mht_3strhash(const void *key, const unsigned int ht_size)
Definition: memory_hash.c:483
unsigned int nentries
Definition: memory_hash.h:70
int mht_compare_ints_are_equal(const void *key1, const void *key2)
Definition: memory_hash.c:731
HENTRY_PTR act_tail
Definition: memory_hash.h:63
unsigned int mht_4strhash(const void *key, const unsigned int ht_size)
Definition: memory_hash.c:505
int mht_compare_logpageids_are_equal(const void *key1, const void *key2)
Definition: memory_hash.c:743
const char * name
Definition: memory_hash.h:151
unsigned int ncollisions
Definition: memory_hash.h:157
int mht_clear_hls(MHT_HLS_TABLE *ht, int(*rem_func)(const void *key, void *data, void *args), void *func_args)
Definition: memory_hash.c:1238
unsigned int size
Definition: memory_hash.h:68
int mht_adjust_lru_list(MHT_TABLE *ht, HENTRY_PTR hentry)
Definition: memory_hash.c:1457
const void * mht_put_hls(MHT_HLS_TABLE *ht, const void *key, void *data)
Definition: memory_hash.c:1730
int mht_rem(MHT_TABLE *ht, const void *key, int(*rem_func)(const void *key, void *data, void *args), void *func_args)
Definition: memory_hash.c:1952
MHT_HLS_TABLE * mht_create_hls(const char *name, int est_size, unsigned int(*hash_func)(const void *key, unsigned int ht_size), int(*cmp_func)(const void *key1, const void *key2))
Definition: memory_hash.c:982
void * mht_get(MHT_TABLE *ht, const void *key)
Definition: memory_hash.c:1419
void mht_destroy_hls(MHT_HLS_TABLE *ht)
Definition: memory_hash.c:1160
const void * mht_put_data(MHT_TABLE *ht, const void *key, void *data)
Definition: memory_hash.c:1756
unsigned int mht_1strlowerhash(const void *key, const unsigned int ht_size)
Definition: memory_hash.c:420
int mht_clear(MHT_TABLE *ht, int(*rem_func)(const void *key, void *data, void *args), void *func_args)
Definition: memory_hash.c:1180
MHT_TABLE * mht_create(const char *name, int est_size, unsigned int(*hash_func)(const void *key, unsigned int ht_size), int(*cmp_func)(const void *key1, const void *key2))
Definition: memory_hash.c:894
int mht_dump(THREAD_ENTRY *thread_p, FILE *out_fp, const MHT_TABLE *ht, const int print_id_opt, int(*print_func)(THREAD_ENTRY *thread_p, FILE *fp, const void *key, void *data, void *args), void *func_args)
Definition: memory_hash.c:1299
unsigned int mht_5strhash(const void *key, const unsigned int ht_size)
Definition: memory_hash.c:521
void * data
Definition: memory_hash.h:50
HENTRY_PTR prealloc_entries
Definition: memory_hash.h:67
unsigned int mht_valhash(const void *key, const unsigned int ht_size)
Definition: memory_hash.c:561
int mht_dump_hls(THREAD_ENTRY *thread_p, FILE *out_fp, const MHT_HLS_TABLE *ht, const int print_id_opt, int(*print_func)(THREAD_ENTRY *thread_p, FILE *fp, const void *data, void *args), void *func_args)
Definition: memory_hash.c:1369
HENTRY_HLS_PTR next
Definition: memory_hash.h:141
unsigned int mht_count(const MHT_TABLE *ht)
Definition: memory_hash.c:2260
HENTRY_PTR * table
Definition: memory_hash.h:60
HENTRY_PTR act_head
Definition: memory_hash.h:61
HENTRY_HLS_PTR tail
Definition: memory_hash.h:140
unsigned int mht_numhash(const void *key, const unsigned int ht_size)
Definition: memory_hash.c:533
const char * name
Definition: memory_hash.h:59
struct hentry * HENTRY_PTR
Definition: memory_hash.h:41
HENTRY_PTR lru_head
Definition: memory_hash.h:65
const void * mht_put(MHT_TABLE *ht, const void *key, void *data)
Definition: memory_hash.c:1778
HENTRY_PTR next
Definition: memory_hash.h:48
int mht_compare_identifiers_equal(const void *key1, const void *key2)
Definition: memory_hash.c:755
unsigned int nentries
Definition: memory_hash.h:155
HENTRY_PTR act_prev
Definition: memory_hash.h:45
void * data
Definition: memory_hash.h:142
unsigned int mht_get_hash_number(const int ht_size, const DB_VALUE *val)
Definition: memory_hash.c:2275
HENTRY_HLS_PTR * table
Definition: memory_hash.h:152
unsigned int mht_ptrhash(const void *ptr, const unsigned int ht_size)
Definition: memory_hash.c:547
const void * key
Definition: memory_hash.h:49
unsigned int ncollisions
Definition: memory_hash.h:72
const void * mht_put_new(MHT_TABLE *ht, const void *key, void *data)
Definition: memory_hash.c:1723
int64_t est_size
Definition: unloaddb.c:54
HENTRY_HLS_PTR prealloc_entries
Definition: memory_hash.h:153
HENTRY_PTR lru_tail
Definition: memory_hash.h:66
int mht_rem2(MHT_TABLE *ht, const void *key, const void *data, int(*rem_func)(const void *key, void *data, void *args), void *func_args)
Definition: memory_hash.c:2078
struct hentry_hls * HENTRY_HLS_PTR
Definition: memory_hash.h:137
int mht_map(const MHT_TABLE *ht, int(*map_func)(const void *key, void *data, void *args), void *func_args)
Definition: memory_hash.c:2199
int mht_compare_strings_are_equal(const void *key1, const void *key2)
Definition: memory_hash.c:767
const void * mht_put2_new(MHT_TABLE *ht, const void *key, void *data)
Definition: memory_hash.c:1901
int mht_map_no_key(THREAD_ENTRY *thread_p, const MHT_TABLE *ht, int(*map_func)(THREAD_ENTRY *thread_p, void *data, void *args), void *func_args)
Definition: memory_hash.c:2231
void * mht_get_hls(const MHT_HLS_TABLE *ht, const void *key, void **last)
Definition: memory_hash.c:1550
HENTRY_PTR lru_prev
Definition: memory_hash.h:47