/[zanavi_public1]/navit/navit/cache.c
ZANavi

Diff of /navit/navit/cache.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 30 Revision 31
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
28struct 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
38struct cache_entry_list
39{
40 struct cache_entry *first, *last;
41 int size;
42};
43
44struct 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
54static void cache_entry_dump(struct cache *cache, struct cache_entry *entry) 29static 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)
163static void cache_remove(struct cache *cache, struct cache_entry *entry) 139static 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
170static struct cache_entry * 149static struct cache_entry *
171cache_remove_lru_helper(struct cache_entry_list *list) 150cache_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
461void cache_dump(struct cache *cache) 450void cache_dump(struct cache *cache)
462{ 451{
463 struct cache_entry *first; 452 struct cache_entry *first;

Legend:
Removed from v.30  
changed lines
  Added in v.31

   
Visit the ZANavi Wiki