… | |
… | |
21 | #ifdef DEBUG_CACHE |
21 | #ifdef DEBUG_CACHE |
22 | #include <stdio.h> |
22 | #include <stdio.h> |
23 | #endif |
23 | #endif |
24 | #include <string.h> |
24 | #include <string.h> |
25 | #include "debug.h" |
25 | #include "debug.h" |
|
|
26 | #include "types.h" |
26 | #include "cache.h" |
27 | #include "cache.h" |
27 | |
|
|
28 | struct cache_entry |
|
|
29 | { |
|
|
30 | int usage; |
|
|
31 | int size; |
|
|
32 | struct cache_entry_list *where; |
|
|
33 | struct cache_entry *next; |
|
|
34 | struct cache_entry *prev; |
|
|
35 | int id[0]; |
|
|
36 | }; |
|
|
37 | |
|
|
38 | struct cache_entry_list |
|
|
39 | { |
|
|
40 | struct cache_entry *first, *last; |
|
|
41 | int size; |
|
|
42 | }; |
|
|
43 | |
|
|
44 | struct cache |
|
|
45 | { |
|
|
46 | struct cache_entry_list t1, b1, t2, b2, *insert; |
|
|
47 | int size, id_size, entry_size; |
|
|
48 | int t1_target; |
|
|
49 | long misses; |
|
|
50 | long hits; |
|
|
51 | GHashTable *hash; |
|
|
52 | }; |
|
|
53 | |
28 | |
54 | static void cache_entry_dump(struct cache *cache, struct cache_entry *entry) |
29 | static void cache_entry_dump(struct cache *cache, struct cache_entry *entry) |
55 | { |
30 | { |
56 | int i, size; |
31 | int i, size; |
57 | //dbg(0,"Usage: %d size %d\n",entry->usage, entry->size); |
32 | //dbg(0,"Usage: %d size %d\n",entry->usage, entry->size); |
… | |
… | |
110 | struct cache *cache=g_new0(struct cache, 1); |
85 | struct cache *cache=g_new0(struct cache, 1); |
111 | |
86 | |
112 | cache->id_size = id_size / 4; |
87 | cache->id_size = id_size / 4; |
113 | cache->entry_size = cache->id_size * sizeof(int) + sizeof(struct cache_entry); |
88 | cache->entry_size = cache->id_size * sizeof(int) + sizeof(struct cache_entry); |
114 | cache->size = size; |
89 | cache->size = size; |
|
|
90 | //cache->real_size_bytes = 0; |
115 | |
91 | |
116 | dbg(0, "_c id_size=%d\n", id_size); |
92 | dbg(0, "_c id_size=%d\n", id_size); |
117 | dbg(0, "_c size=%d\n", size); |
93 | dbg(0, "_c size=%d\n", size); |
118 | |
94 | |
119 | switch (id_size) |
95 | switch (id_size) |
… | |
… | |
163 | static void cache_remove(struct cache *cache, struct cache_entry *entry) |
139 | static void cache_remove(struct cache *cache, struct cache_entry *entry) |
164 | { |
140 | { |
165 | // dbg(1,"remove 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); |
141 | // dbg(1,"remove 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); |
166 | g_hash_table_remove(cache->hash, (gpointer)(entry->id)); |
142 | g_hash_table_remove(cache->hash, (gpointer)(entry->id)); |
167 | g_slice_free1(entry->size, entry); |
143 | g_slice_free1(entry->size, entry); |
|
|
144 | // real size |
|
|
145 | //dbg(0,"1cache->real_size_bytes="LONGLONG_FMT"\n", cache->real_size_bytes); |
|
|
146 | //cache->real_size_bytes = cache->real_size_bytes - entry->size; |
168 | } |
147 | } |
169 | |
148 | |
170 | static struct cache_entry * |
149 | static struct cache_entry * |
171 | cache_remove_lru_helper(struct cache_entry_list *list) |
150 | cache_remove_lru_helper(struct cache_entry_list *list) |
172 | { |
151 | { |
… | |
… | |
214 | struct cache_entry *ret; |
193 | struct cache_entry *ret; |
215 | size += cache->entry_size; |
194 | size += cache->entry_size; |
216 | // cache->misses += size; |
195 | // cache->misses += size; |
217 | cache->misses += 1; |
196 | cache->misses += 1; |
218 | ret = (struct cache_entry *) g_slice_alloc0(size); |
197 | ret = (struct cache_entry *) g_slice_alloc0(size); |
|
|
198 | // real size |
|
|
199 | //dbg(0,"2cache->real_size_bytes="LONGLONG_FMT"\n", cache->real_size_bytes); |
|
|
200 | //cache->real_size_bytes = cache->real_size_bytes + size; |
219 | ret->size = size; |
201 | ret->size = size; |
220 | ret->usage = 1; |
202 | ret->usage = 1; |
221 | memcpy(ret->id, id, cache->id_size * sizeof(int)); |
203 | memcpy(ret->id, id, cache->id_size * sizeof(int)); |
222 | return &ret->id[cache->id_size]; |
204 | return &ret->id[cache->id_size]; |
223 | } |
205 | } |
… | |
… | |
238 | if (cache->entry_size < entry->size) |
220 | if (cache->entry_size < entry->size) |
239 | { |
221 | { |
240 | g_hash_table_remove(cache->hash, (gpointer)(entry->id)); |
222 | g_hash_table_remove(cache->hash, (gpointer)(entry->id)); |
241 | |
223 | |
242 | new_entry = g_slice_alloc0(cache->entry_size); |
224 | new_entry = g_slice_alloc0(cache->entry_size); |
|
|
225 | // real size |
|
|
226 | //dbg(0,"3cache->real_size_bytes="LONGLONG_FMT"\n", cache->real_size_bytes); |
|
|
227 | //cache->real_size_bytes = cache->real_size_bytes + cache->entry_size; |
243 | memcpy(new_entry, entry, cache->entry_size); |
228 | memcpy(new_entry, entry, cache->entry_size); |
244 | g_slice_free1(entry->size, entry); |
229 | g_slice_free1(entry->size, entry); |
|
|
230 | // real size |
|
|
231 | //cache->real_size_bytes = cache->real_size_bytes - entry->size; |
|
|
232 | |
245 | new_entry->size = cache->entry_size; |
233 | new_entry->size = cache->entry_size; |
246 | |
234 | |
247 | g_hash_table_insert(cache->hash, (gpointer) new_entry->id, new_entry); |
235 | g_hash_table_insert(cache->hash, (gpointer) new_entry->id, new_entry); |
248 | } |
236 | } |
249 | else |
237 | else |
… | |
… | |
400 | else |
388 | else |
401 | { |
389 | { |
402 | if (cache->t1.size + cache->t2.size + cache->b1.size + cache->b2.size >= cache->size) |
390 | if (cache->t1.size + cache->t2.size + cache->b1.size + cache->b2.size >= cache->size) |
403 | { |
391 | { |
404 | if (cache->t1.size + cache->t2.size + cache->b1.size + cache->b2.size >= 2 * cache->size) |
392 | if (cache->t1.size + cache->t2.size + cache->b1.size + cache->b2.size >= 2 * cache->size) |
|
|
393 | { |
405 | cache_remove_lru(cache, &cache->b2); |
394 | cache_remove_lru(cache, &cache->b2); |
|
|
395 | } |
406 | cache_replace(cache); |
396 | cache_replace(cache); |
407 | } |
397 | } |
408 | } |
398 | } |
409 | } |
399 | } |
410 | cache_insert_mru(cache, cache->insert, entry); |
400 | cache_insert_mru(cache, cache->insert, entry); |
… | |
… | |
452 | cache->hits = 0; |
442 | cache->hits = 0; |
453 | cache->misses = 0; |
443 | cache->misses = 0; |
454 | } |
444 | } |
455 | } |
445 | } |
456 | |
446 | |
457 | |
447 | // dbg(0,"CACHE wanted size=%d real size=%lu\n", cache->size, cache->real_size_bytes); |
458 | |
|
|
459 | } |
448 | } |
460 | |
449 | |
461 | void cache_dump(struct cache *cache) |
450 | void cache_dump(struct cache *cache) |
462 | { |
451 | { |
463 | struct cache_entry *first; |
452 | struct cache_entry *first; |