handle.c revision e919dee1edd469c174c5c07c95efd4932a674b67
1/************************************************************************** 2 * 3 * Copyright 2010 VMware, Inc. All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sub license, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial portions 15 * of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 * 25 **************************************************************************/ 26 27 28#include "handle.h" 29#include "util/u_hash.h" 30#include "util/u_hash_table.h" 31 32 33/** 34 * Hash keys are 32-bit VGHandles 35 */ 36 37struct util_hash_table *handle_hash = NULL; 38 39 40static unsigned next_handle = 1; 41 42 43static unsigned 44hash_func(void *key) 45{ 46 /* XXX this kind of ugly */ 47 intptr_t ip = pointer_to_intptr(key); 48 return (unsigned) (ip & 0xffffffff); 49} 50 51 52static int 53compare(void *key1, void *key2) 54{ 55 if (key1 < key2) 56 return -1; 57 else if (key1 > key2) 58 return +1; 59 else 60 return 0; 61} 62 63 64void 65init_handles(void) 66{ 67 if (!handle_hash) 68 handle_hash = util_hash_table_create(hash_func, compare); 69} 70 71 72void 73free_handles(void) 74{ 75 /* XXX destroy */ 76} 77 78 79VGHandle 80create_handle(void *object) 81{ 82 VGHandle h = next_handle++; 83 util_hash_table_set(handle_hash, intptr_to_pointer(h), object); 84 return h; 85} 86 87 88void 89destroy_handle(VGHandle h) 90{ 91 util_hash_table_remove(handle_hash, intptr_to_pointer(h)); 92} 93 94