1393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee/************************************************************************** 2393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * 3393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * Copyright 2010 VMware, Inc. 4393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * All Rights Reserved. 5393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * 6393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * Permission is hereby granted, free of charge, to any person obtaining a 7393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * copy of this software and associated documentation files (the 8393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * "Software"), to deal in the Software without restriction, including 9393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * without limitation the rights to use, copy, modify, merge, publish, 10393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * distribute, sub license, and/or sell copies of the Software, and to 11393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * permit persons to whom the Software is furnished to do so, subject to 12393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * the following conditions: 13393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * 14393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * The above copyright notice and this permission notice (including the 15393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * next paragraph) shall be included in all copies or substantial portions 16393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * of the Software. 17393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * 18393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * 26393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee **************************************************************************/ 27393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 28393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 29393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee/* 30393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * Test case for u_cache. 31393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee */ 32393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 33393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 34393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee#include <assert.h> 35393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee#include <stdio.h> 36393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 37393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee#include "util/u_cache.h" 38393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee#include "util/u_hash.h" 39393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 40393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 41393009a939c5874e613b1cfa9836c0d925f5b42eVinson Leetypedef uint32_t cache_test_key; 42393009a939c5874e613b1cfa9836c0d925f5b42eVinson Leetypedef uint32_t cache_test_value; 43393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 44393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 45393009a939c5874e613b1cfa9836c0d925f5b42eVinson Leestatic uint32_t 46393009a939c5874e613b1cfa9836c0d925f5b42eVinson Leecache_test_hash(const void *key) 47393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee{ 48393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee return util_hash_crc32(key, sizeof(cache_test_key)); 49393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee} 50393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 51393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 52393009a939c5874e613b1cfa9836c0d925f5b42eVinson Leestatic void 53393009a939c5874e613b1cfa9836c0d925f5b42eVinson Leecache_test_destroy(void *key, void *value) 54393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee{ 55393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee free(key); 56393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee free(value); 57393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee} 58393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 59393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 60393009a939c5874e613b1cfa9836c0d925f5b42eVinson Leestatic int 61393009a939c5874e613b1cfa9836c0d925f5b42eVinson Leecache_test_compare(const void *key1, const void *key2) { 62393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee return !(key1 == key2); 63393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee} 64393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 65393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 66393009a939c5874e613b1cfa9836c0d925f5b42eVinson Leeint main() { 67393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee unsigned cache_size; 68393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee unsigned cache_count; 69393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 70393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee for (cache_size = 2; cache_size < (1 << 15); cache_size *= 2) { 71393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee for (cache_count = (cache_size << 5); cache_count < (cache_size << 10); cache_count *= 2) { 72393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee struct util_cache * cache; 73393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee cache_test_key *key; 74393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee cache_test_value *value_in; 75393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee cache_test_value *value_out; 76393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee int i; 77393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 78393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee printf("Testing cache size of %d with %d values.\n", cache_size, cache_count); 79393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 80393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee cache = util_cache_create(cache_test_hash, 81393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee cache_test_compare, 82393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee cache_test_destroy, 83393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee cache_size); 84393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 85393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee /* 86393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * Retrieve a value from an empty cache. 87393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee */ 88393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee key = malloc(sizeof(cache_test_key)); 89393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee *key = 0xdeadbeef; 90393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee value_out = (cache_test_value *) util_cache_get(cache, key); 91393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee assert(value_out == NULL); 92393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee free(key); 93393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 94393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 95393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee /* 96393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * Repeatedly insert into and retrieve values from the cache. 97393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee */ 98393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee for (i = 0; i < cache_count; i++) { 99393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee key = malloc(sizeof(cache_test_key)); 100393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee value_in = malloc(sizeof(cache_test_value)); 101393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 102393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee *key = rand(); 103393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee *value_in = rand(); 104393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee util_cache_set(cache, key, value_in); 105393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 106393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee value_out = util_cache_get(cache, key); 107393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee assert(value_out != NULL); 108393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee assert(value_in == value_out); 109393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee assert(*value_in == *value_out); 110393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee } 111393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 112393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee /* 113393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * In debug builds, this will trigger a self-check by the cache of 114393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee * the distribution of hits in its internal cache entries. 115393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee */ 116393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee util_cache_destroy(cache); 117393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee } 118393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee } 119393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee 120393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee return 0; 121393009a939c5874e613b1cfa9836c0d925f5b42eVinson Lee} 122