1bf215546Sopenharmony_ci/************************************************************************** 2bf215546Sopenharmony_ci * 3bf215546Sopenharmony_ci * Copyright 2010 VMware, Inc. 4bf215546Sopenharmony_ci * All Rights Reserved. 5bf215546Sopenharmony_ci * 6bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 7bf215546Sopenharmony_ci * copy of this software and associated documentation files (the 8bf215546Sopenharmony_ci * "Software"), to deal in the Software without restriction, including 9bf215546Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish, 10bf215546Sopenharmony_ci * distribute, sub license, and/or sell copies of the Software, and to 11bf215546Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to 12bf215546Sopenharmony_ci * the following conditions: 13bf215546Sopenharmony_ci * 14bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the 15bf215546Sopenharmony_ci * next paragraph) shall be included in all copies or substantial portions 16bf215546Sopenharmony_ci * of the Software. 17bf215546Sopenharmony_ci * 18bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19bf215546Sopenharmony_ci * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20bf215546Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21bf215546Sopenharmony_ci * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22bf215546Sopenharmony_ci * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23bf215546Sopenharmony_ci * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24bf215546Sopenharmony_ci * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25bf215546Sopenharmony_ci * 26bf215546Sopenharmony_ci **************************************************************************/ 27bf215546Sopenharmony_ci 28bf215546Sopenharmony_ci 29bf215546Sopenharmony_ci/* 30bf215546Sopenharmony_ci * Test case for u_cache. 31bf215546Sopenharmony_ci */ 32bf215546Sopenharmony_ci 33bf215546Sopenharmony_ci 34bf215546Sopenharmony_ci#include <assert.h> 35bf215546Sopenharmony_ci#include <stdio.h> 36bf215546Sopenharmony_ci 37bf215546Sopenharmony_ci#include "util/u_cache.h" 38bf215546Sopenharmony_ci#include "util/crc32.h" 39bf215546Sopenharmony_ci 40bf215546Sopenharmony_ci 41bf215546Sopenharmony_citypedef uint32_t cache_test_key; 42bf215546Sopenharmony_citypedef uint32_t cache_test_value; 43bf215546Sopenharmony_ci 44bf215546Sopenharmony_ci 45bf215546Sopenharmony_cistatic uint32_t 46bf215546Sopenharmony_cicache_test_hash(const void *key) 47bf215546Sopenharmony_ci{ 48bf215546Sopenharmony_ci return util_hash_crc32(key, sizeof(cache_test_key)); 49bf215546Sopenharmony_ci} 50bf215546Sopenharmony_ci 51bf215546Sopenharmony_ci 52bf215546Sopenharmony_cistatic void 53bf215546Sopenharmony_cicache_test_destroy(void *key, void *value) 54bf215546Sopenharmony_ci{ 55bf215546Sopenharmony_ci free(key); 56bf215546Sopenharmony_ci free(value); 57bf215546Sopenharmony_ci} 58bf215546Sopenharmony_ci 59bf215546Sopenharmony_ci 60bf215546Sopenharmony_cistatic int 61bf215546Sopenharmony_cicache_test_compare(const void *key1, const void *key2) { 62bf215546Sopenharmony_ci return !(key1 == key2); 63bf215546Sopenharmony_ci} 64bf215546Sopenharmony_ci 65bf215546Sopenharmony_ci 66bf215546Sopenharmony_ciint main() { 67bf215546Sopenharmony_ci unsigned cache_size; 68bf215546Sopenharmony_ci unsigned cache_count; 69bf215546Sopenharmony_ci 70bf215546Sopenharmony_ci for (cache_size = 2; cache_size < (1 << 15); cache_size *= 2) { 71bf215546Sopenharmony_ci for (cache_count = (cache_size << 5); cache_count < (cache_size << 10); cache_count *= 2) { 72bf215546Sopenharmony_ci struct util_cache * cache; 73bf215546Sopenharmony_ci cache_test_key *key; 74bf215546Sopenharmony_ci cache_test_value *value_in; 75bf215546Sopenharmony_ci cache_test_value *value_out; 76bf215546Sopenharmony_ci int i; 77bf215546Sopenharmony_ci 78bf215546Sopenharmony_ci printf("Testing cache size of %d with %d values.\n", cache_size, cache_count); 79bf215546Sopenharmony_ci 80bf215546Sopenharmony_ci cache = util_cache_create(cache_test_hash, 81bf215546Sopenharmony_ci cache_test_compare, 82bf215546Sopenharmony_ci cache_test_destroy, 83bf215546Sopenharmony_ci cache_size); 84bf215546Sopenharmony_ci 85bf215546Sopenharmony_ci /* 86bf215546Sopenharmony_ci * Retrieve a value from an empty cache. 87bf215546Sopenharmony_ci */ 88bf215546Sopenharmony_ci key = malloc(sizeof(cache_test_key)); 89bf215546Sopenharmony_ci *key = 0xdeadbeef; 90bf215546Sopenharmony_ci value_out = (cache_test_value *) util_cache_get(cache, key); 91bf215546Sopenharmony_ci assert(value_out == NULL); 92bf215546Sopenharmony_ci (void)value_out; 93bf215546Sopenharmony_ci free(key); 94bf215546Sopenharmony_ci 95bf215546Sopenharmony_ci 96bf215546Sopenharmony_ci /* 97bf215546Sopenharmony_ci * Repeatedly insert into and retrieve values from the cache. 98bf215546Sopenharmony_ci */ 99bf215546Sopenharmony_ci for (i = 0; i < cache_count; i++) { 100bf215546Sopenharmony_ci key = malloc(sizeof(cache_test_key)); 101bf215546Sopenharmony_ci value_in = malloc(sizeof(cache_test_value)); 102bf215546Sopenharmony_ci 103bf215546Sopenharmony_ci *key = rand(); 104bf215546Sopenharmony_ci *value_in = rand(); 105bf215546Sopenharmony_ci util_cache_set(cache, key, value_in); 106bf215546Sopenharmony_ci 107bf215546Sopenharmony_ci value_out = util_cache_get(cache, key); 108bf215546Sopenharmony_ci assert(value_out != NULL); 109bf215546Sopenharmony_ci assert(value_in == value_out); 110bf215546Sopenharmony_ci assert(*value_in == *value_out); 111bf215546Sopenharmony_ci } 112bf215546Sopenharmony_ci 113bf215546Sopenharmony_ci /* 114bf215546Sopenharmony_ci * In debug builds, this will trigger a self-check by the cache of 115bf215546Sopenharmony_ci * the distribution of hits in its internal cache entries. 116bf215546Sopenharmony_ci */ 117bf215546Sopenharmony_ci util_cache_destroy(cache); 118bf215546Sopenharmony_ci } 119bf215546Sopenharmony_ci } 120bf215546Sopenharmony_ci 121bf215546Sopenharmony_ci return 0; 122bf215546Sopenharmony_ci} 123