util/disk_cache: fix stored_keys index
authorGrazvydas Ignotas <notasas@gmail.com>
Sat, 18 Mar 2017 22:46:39 +0000 (00:46 +0200)
committerTimothy Arceri <tarceri@itsqueeze.com>
Sun, 19 Mar 2017 21:14:31 +0000 (08:14 +1100)
It seems there is a bug because:
- 20 bytes are compared, but only 1 byte stored_keys step is used
- entries can overlap each other by 19 bytes
- index_mmap is ~1.3M in size, but only first 64K is used

With this fix for Deus Ex:
- startup time (from launch to Feral logo): ~38s -> ~16s
- disk_cache_has_key() hit rate: ~50% -> ~96%

Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/util/disk_cache.c

index 6c91f23ffbb3789c2a428f6c7187c5ea8bf9295d..79ec63080cadf00401b45f8b283b1480541d8315 100644 (file)
@@ -1033,7 +1033,7 @@ disk_cache_put_key(struct disk_cache *cache, const cache_key key)
    int i = *key_chunk & CACHE_INDEX_KEY_MASK;
    unsigned char *entry;
 
-   entry = &cache->stored_keys[i + CACHE_KEY_SIZE];
+   entry = &cache->stored_keys[i * CACHE_KEY_SIZE];
 
    memcpy(entry, key, CACHE_KEY_SIZE);
 }
@@ -1052,7 +1052,7 @@ disk_cache_has_key(struct disk_cache *cache, const cache_key key)
    int i = *key_chunk & CACHE_INDEX_KEY_MASK;
    unsigned char *entry;
 
-   entry = &cache->stored_keys[i + CACHE_KEY_SIZE];
+   entry = &cache->stored_keys[i * CACHE_KEY_SIZE];
 
    return memcmp(entry, key, CACHE_KEY_SIZE) == 0;
 }