VirtualBox

source: kBuild/trunk/src/kmk/strcache2.h@ 1885

Last change on this file since 1885 was 1885, checked in by bird, 16 years ago

kmk: strcache2_add_file macro for wrapping case sensitive/insenstive hashing, avoiding a couple of checks a lots of inlined code in strcache2.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.3 KB
Line 
1/* $Id: strcache2.h 1885 2008-10-19 21:30:02Z bird $ */
2/** @file
3 * strcache - New string cache.
4 */
5
6/*
7 * Copyright (c) 2006-2008 knut st. osmundsen <[email protected]>
8 *
9 * This file is part of kBuild.
10 *
11 * kBuild is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * kBuild is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with kBuild; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 *
25 */
26
27#ifndef ___strcache2_h
28#define ___strcache2_h
29
30/* string cache memory segment. */
31struct strcache2_seg
32{
33 struct strcache2_seg *next; /* The next cache segment. */
34 char *start; /* The first byte in the segment. */
35 size_t size; /* The size of the segment. */
36 size_t avail; /* The number of available bytes. */
37 char *cursor; /* Allocation cursor. */
38};
39
40/* string cache hash table entry. */
41struct strcache2_entry
42{
43 void *user;
44 unsigned int hash1;
45 unsigned int hash2;
46 unsigned int length;
47};
48
49struct strcache2
50{
51 struct strcache2_entry **hash_tab; /* The hash table. */
52 int case_insensitive; /* case insensitive or not. */
53 unsigned int hash_mask; /* The AND mask matching hash_size.*/
54 unsigned long lookup_count; /* The number of lookups. */
55 unsigned long collision_1st_count; /* The number of 1st level collisions. */
56 unsigned long collision_2nd_count; /* The number of 2nd level collisions. */
57 unsigned long collision_3rd_count; /* The number of 3rd level collisions. */
58 unsigned int count; /* Number entries in the cache. */
59 unsigned int rehash_count; /* When to rehash the table. */
60 unsigned int init_size; /* The initial hash table size. */
61 unsigned int hash_size; /* The hash table size. */
62 unsigned int def_seg_size; /* The default segment size. */
63 void *lock; /* The lock handle. */
64 struct strcache2_seg *seg_head; /* The memory segment list. */
65 struct strcache2 *next; /* The next string cache. */
66 const char *name; /* Cache name. */
67};
68
69
70void strcache2_init (struct strcache2 *cache, const char *name, unsigned int size,
71 unsigned int def_seg_size, int case_insensitive, int thread_safe);
72void strcache2_term (struct strcache2 *cache);
73void strcache2_print_stats (struct strcache2 *cache, const char *prefix);
74void strcache2_print_stats_all (const char *prefix);
75const char *strcache2_add (struct strcache2 *cache, const char *str, unsigned int length);
76const char *strcache2_iadd (struct strcache2 *cache, const char *str, unsigned int length);
77#ifdef HAVE_CASE_INSENSITIVE_FS
78# define strcache2_add_file(cache, str, length) strcache2_iadd((cache), (str), (length))
79#else
80# define strcache2_add_file(cache, str, length) strcache2_add((cache), (str), (length))
81#endif
82const char *strcache2_add_hashed (struct strcache2 *cache, const char *str, unsigned int length,
83 unsigned int hash1, unsigned int hash2);
84int strcache2_is_cached (struct strcache2 *cache, const char *str);
85int strcache2_verify_entry (struct strcache2 *cache, const char *str);
86unsigned int strcache2_get_hash2_fallback (struct strcache2 *cache, const char *str);
87unsigned int strcache2_hash_str (const char *str, unsigned int length, unsigned int *hash2p);
88unsigned int strcache2_hash_istr (const char *str, unsigned int length, unsigned int *hash2p);
89
90/* Get the hash table entry pointer. */
91MY_INLINE struct strcache2_entry const *
92strcache2_get_entry (struct strcache2 *cache, const char *str)
93{
94#ifndef NDEBUG
95 strcache2_verify_entry (cache, str);
96#endif
97 return (struct strcache2_entry const *)str - 1;
98}
99
100/* Get the string length. */
101MY_INLINE unsigned int
102strcache2_get_len (struct strcache2 *cache, const char *str)
103{
104 return strcache2_get_entry (cache, str)->length;
105}
106
107/* Get the first hash value for the string. */
108MY_INLINE unsigned int
109strcache2_get_hash1 (struct strcache2 *cache, const char *str)
110{
111 return strcache2_get_entry (cache, str)->hash1;
112}
113
114/* Get the second hash value for the string. */
115MY_INLINE unsigned int
116strcache2_get_hash2 (struct strcache2 *cache, const char *str)
117{
118 unsigned int hash2 = strcache2_get_entry (cache, str)->hash2;
119 if (!hash2)
120 hash2 = strcache2_get_hash2_fallback (cache, str);
121 return hash2;
122}
123
124/* Get the user value for the string. */
125MY_INLINE void *
126strcache2_get_user_val (struct strcache2 *cache, const char *str)
127{
128 return strcache2_get_entry (cache, str)->user;
129}
130
131/* Get the user value for the string. */
132MY_INLINE void
133strcache2_set_user_val (struct strcache2 *cache, const char *str, void *value)
134{
135 struct strcache2_entry *entry = (struct strcache2_entry *)str - 1;
136#ifndef NDEBUG
137 strcache2_verify_entry (cache, str);
138#endif
139 entry->user = value;
140}
141
142#endif
143
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette