1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker *
3*61046927SAndroid Build Coastguard Worker * Copyright 2008 VMware, Inc.
4*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker *
6*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
8*61046927SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
9*61046927SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
10*61046927SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
11*61046927SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
12*61046927SAndroid Build Coastguard Worker * the following conditions:
13*61046927SAndroid Build Coastguard Worker *
14*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
15*61046927SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
16*61046927SAndroid Build Coastguard Worker * of the Software.
17*61046927SAndroid Build Coastguard Worker *
18*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*61046927SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21*61046927SAndroid Build Coastguard Worker * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22*61046927SAndroid Build Coastguard Worker * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23*61046927SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24*61046927SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25*61046927SAndroid Build Coastguard Worker *
26*61046927SAndroid Build Coastguard Worker **************************************************************************/
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker #include "util/u_pointer.h"
30*61046927SAndroid Build Coastguard Worker #include "util/u_hash_table.h"
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker #if DETECT_OS_POSIX
33*61046927SAndroid Build Coastguard Worker #include <sys/stat.h>
34*61046927SAndroid Build Coastguard Worker #endif
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker static uint32_t
pointer_hash(const void * key)38*61046927SAndroid Build Coastguard Worker pointer_hash(const void *key)
39*61046927SAndroid Build Coastguard Worker {
40*61046927SAndroid Build Coastguard Worker return _mesa_hash_pointer(key);
41*61046927SAndroid Build Coastguard Worker }
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker static bool
pointer_equal(const void * a,const void * b)45*61046927SAndroid Build Coastguard Worker pointer_equal(const void *a, const void *b)
46*61046927SAndroid Build Coastguard Worker {
47*61046927SAndroid Build Coastguard Worker return a == b;
48*61046927SAndroid Build Coastguard Worker }
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker struct hash_table *
util_hash_table_create_ptr_keys(void)52*61046927SAndroid Build Coastguard Worker util_hash_table_create_ptr_keys(void)
53*61046927SAndroid Build Coastguard Worker {
54*61046927SAndroid Build Coastguard Worker return _mesa_hash_table_create(NULL, pointer_hash, pointer_equal);
55*61046927SAndroid Build Coastguard Worker }
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker
hash_fd(const void * key)58*61046927SAndroid Build Coastguard Worker static uint32_t hash_fd(const void *key)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker #if DETECT_OS_POSIX
61*61046927SAndroid Build Coastguard Worker int fd = pointer_to_intptr(key);
62*61046927SAndroid Build Coastguard Worker struct stat stat;
63*61046927SAndroid Build Coastguard Worker
64*61046927SAndroid Build Coastguard Worker fstat(fd, &stat);
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
67*61046927SAndroid Build Coastguard Worker #else
68*61046927SAndroid Build Coastguard Worker return 0;
69*61046927SAndroid Build Coastguard Worker #endif
70*61046927SAndroid Build Coastguard Worker }
71*61046927SAndroid Build Coastguard Worker
72*61046927SAndroid Build Coastguard Worker
equal_fd(const void * key1,const void * key2)73*61046927SAndroid Build Coastguard Worker static bool equal_fd(const void *key1, const void *key2)
74*61046927SAndroid Build Coastguard Worker {
75*61046927SAndroid Build Coastguard Worker #if DETECT_OS_POSIX
76*61046927SAndroid Build Coastguard Worker int fd1 = pointer_to_intptr(key1);
77*61046927SAndroid Build Coastguard Worker int fd2 = pointer_to_intptr(key2);
78*61046927SAndroid Build Coastguard Worker struct stat stat1, stat2;
79*61046927SAndroid Build Coastguard Worker
80*61046927SAndroid Build Coastguard Worker fstat(fd1, &stat1);
81*61046927SAndroid Build Coastguard Worker fstat(fd2, &stat2);
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard Worker return stat1.st_dev == stat2.st_dev &&
84*61046927SAndroid Build Coastguard Worker stat1.st_ino == stat2.st_ino &&
85*61046927SAndroid Build Coastguard Worker stat1.st_rdev == stat2.st_rdev;
86*61046927SAndroid Build Coastguard Worker #else
87*61046927SAndroid Build Coastguard Worker return 0;
88*61046927SAndroid Build Coastguard Worker #endif
89*61046927SAndroid Build Coastguard Worker }
90*61046927SAndroid Build Coastguard Worker
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker struct hash_table *
util_hash_table_create_fd_keys(void)93*61046927SAndroid Build Coastguard Worker util_hash_table_create_fd_keys(void)
94*61046927SAndroid Build Coastguard Worker {
95*61046927SAndroid Build Coastguard Worker return _mesa_hash_table_create(NULL, hash_fd, equal_fd);
96*61046927SAndroid Build Coastguard Worker }
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker
99*61046927SAndroid Build Coastguard Worker void *
util_hash_table_get(struct hash_table * ht,void * key)100*61046927SAndroid Build Coastguard Worker util_hash_table_get(struct hash_table *ht,
101*61046927SAndroid Build Coastguard Worker void *key)
102*61046927SAndroid Build Coastguard Worker {
103*61046927SAndroid Build Coastguard Worker struct hash_entry *entry = _mesa_hash_table_search(ht, key);
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker return entry ? entry->data : NULL;
106*61046927SAndroid Build Coastguard Worker }
107*61046927SAndroid Build Coastguard Worker
108*61046927SAndroid Build Coastguard Worker
109*61046927SAndroid Build Coastguard Worker int
util_hash_table_foreach(struct hash_table * ht,int (* callback)(void * key,void * value,void * data),void * data)110*61046927SAndroid Build Coastguard Worker util_hash_table_foreach(struct hash_table *ht,
111*61046927SAndroid Build Coastguard Worker int (*callback)
112*61046927SAndroid Build Coastguard Worker (void *key, void *value, void *data),
113*61046927SAndroid Build Coastguard Worker void *data)
114*61046927SAndroid Build Coastguard Worker {
115*61046927SAndroid Build Coastguard Worker hash_table_foreach(ht, entry) {
116*61046927SAndroid Build Coastguard Worker int error = callback((void*)entry->key, entry->data, data);
117*61046927SAndroid Build Coastguard Worker if (error != 0)
118*61046927SAndroid Build Coastguard Worker return error;
119*61046927SAndroid Build Coastguard Worker }
120*61046927SAndroid Build Coastguard Worker return 0;
121*61046927SAndroid Build Coastguard Worker }
122