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 37 struct util_hash_table *handle_hash = NULL; 38 39 40 static unsigned next_handle = 1; 41 42 43 static unsigned 44 hash_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 52 static int 53 compare(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 64 void 65 init_handles(void) 66 { 67 if (!handle_hash) 68 handle_hash = util_hash_table_create(hash_func, compare); 69 } 70 71 72 void 73 free_handles(void) 74 { 75 /* XXX destroy */ 76 } 77 78 79 VGHandle 80 create_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 88 void 89 destroy_handle(VGHandle h) 90 { 91 util_hash_table_remove(handle_hash, intptr_to_pointer(h)); 92 } 93 94