source: trunk/src/kmk/strcache2.h@ 1876

Last change on this file since 1876 was 1870, checked in by bird, 17 years ago

kmk: replaced strcache with strcacahe2.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.0 KB
Line 
1/* $Id: strcache2.h 1870 2008-10-16 23:15:30Z bird $ */
2/** @file
3 * strcache - New string cache.
4 */
5
6/*
7 * Copyright (c) 2006-2008 knut st. osmundsen <bird-src-spam@anduin.net>
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_add_hashed (struct strcache2 *cache, const char *str, unsigned int length,
77 unsigned int hash1, unsigned int hash2);
78int strcache2_is_cached (struct strcache2 *cache, const char *str);
79int strcache2_verify_entry (struct strcache2 *cache, const char *str);
80unsigned int strcache2_get_hash2_fallback (struct strcache2 *cache, const char *str);
81unsigned int strcache2_hash_str (const char *str, unsigned int length, unsigned int *hash2p);
82unsigned int strcache2_hash_istr (const char *str, unsigned int length, unsigned int *hash2p);
83
84/* Get the hash table entry pointer. */
85MY_INLINE struct strcache2_entry const *
86strcache2_get_entry (struct strcache2 *cache, const char *str)
87{
88#ifndef NDEBUG
89 strcache2_verify_entry (cache, str);
90#endif
91 return (struct strcache2_entry const *)str - 1;
92}
93
94/* Get the string length. */
95MY_INLINE unsigned int
96strcache2_get_len (struct strcache2 *cache, const char *str)
97{
98 return strcache2_get_entry (cache, str)->length;
99}
100
101/* Get the first hash value for the string. */
102MY_INLINE unsigned int
103strcache2_get_hash1 (struct strcache2 *cache, const char *str)
104{
105 return strcache2_get_entry (cache, str)->hash1;
106}
107
108/* Get the second hash value for the string. */
109MY_INLINE unsigned int
110strcache2_get_hash2 (struct strcache2 *cache, const char *str)
111{
112 unsigned int hash2 = strcache2_get_entry (cache, str)->hash2;
113 if (!hash2)
114 hash2 = strcache2_get_hash2_fallback (cache, str);
115 return hash2;
116}
117
118/* Get the user value for the string. */
119MY_INLINE void *
120strcache2_get_user_val (struct strcache2 *cache, const char *str)
121{
122 return strcache2_get_entry (cache, str)->user;
123}
124
125/* Get the user value for the string. */
126MY_INLINE void
127strcache2_set_user_val (struct strcache2 *cache, const char *str, void *value)
128{
129 struct strcache2_entry *entry = (struct strcache2_entry *)str - 1;
130#ifndef NDEBUG
131 strcache2_verify_entry (cache, str);
132#endif
133 entry->user = value;
134}
135
136#endif
137
Note: See TracBrowser for help on using the repository browser.