xref: /aosp_15_r20/external/mesa3d/src/util/u_hash_table.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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