util/disk_cache: fix a comment
[mesa.git] / src / util / disk_cache.h
1 /*
2 * Copyright © 2014 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23
24 #ifndef DISK_CACHE_H
25 #define DISK_CACHE_H
26
27 #ifdef ENABLE_SHADER_CACHE
28 #include <dlfcn.h>
29 #endif
30 #include <assert.h>
31 #include <stdint.h>
32 #include <stdbool.h>
33 #include <sys/stat.h>
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 /* Size of cache keys in bytes. */
40 #define CACHE_KEY_SIZE 20
41
42 typedef uint8_t cache_key[CACHE_KEY_SIZE];
43
44 struct disk_cache;
45
46 static inline bool
47 disk_cache_get_function_timestamp(void *ptr, uint32_t* timestamp)
48 {
49 #ifdef ENABLE_SHADER_CACHE
50 Dl_info info;
51 struct stat st;
52 if (!dladdr(ptr, &info) || !info.dli_fname) {
53 return false;
54 }
55 if (stat(info.dli_fname, &st)) {
56 return false;
57 }
58 *timestamp = st.st_mtime;
59 return true;
60 #else
61 return false;
62 #endif
63 }
64
65 /* Provide inlined stub functions if the shader cache is disabled. */
66
67 #ifdef ENABLE_SHADER_CACHE
68
69 /**
70 * Create a new cache object.
71 *
72 * This function creates the handle necessary for all subsequent cache_*
73 * functions.
74 *
75 * This cache provides two distinct operations:
76 *
77 * o Storage and retrieval of arbitrary objects by cryptographic
78 * name (or "key"). This is provided via disk_cache_put() and
79 * disk_cache_get().
80 *
81 * o The ability to store a key alone and check later whether the
82 * key was previously stored. This is provided via disk_cache_put_key()
83 * and disk_cache_has_key().
84 *
85 * The put_key()/has_key() operations are conceptually identical to
86 * put()/get() with no data, but are provided separately to allow for
87 * a more efficient implementation.
88 *
89 * In all cases, the keys are sequences of 20 bytes. It is anticipated
90 * that callers will compute appropriate SHA-1 signatures for keys,
91 * (though nothing in this implementation directly relies on how the
92 * names are computed). See mesa-sha1.h and _mesa_sha1_compute for
93 * assistance in computing SHA-1 signatures.
94 */
95 struct disk_cache *
96 disk_cache_create(const char *gpu_name, const char *timestamp,
97 uint64_t driver_flags);
98
99 /**
100 * Destroy a cache object, (freeing all associated resources).
101 */
102 void
103 disk_cache_destroy(struct disk_cache *cache);
104
105 /**
106 * Remove the item in the cache under the name \key.
107 */
108 void
109 disk_cache_remove(struct disk_cache *cache, const cache_key key);
110
111 /**
112 * Store an item in the cache under the name \key.
113 *
114 * The item can be retrieved later with disk_cache_get(), (unless the item has
115 * been evicted in the interim).
116 *
117 * Any call to disk_cache_put() may cause an existing, random item to be
118 * evicted from the cache.
119 */
120 void
121 disk_cache_put(struct disk_cache *cache, const cache_key key,
122 const void *data, size_t size);
123
124 /**
125 * Retrieve an item previously stored in the cache with the name <key>.
126 *
127 * The item must have been previously stored with a call to disk_cache_put().
128 *
129 * If \size is non-NULL, then, on successful return, it will be set to the
130 * size of the object.
131 *
132 * \return A pointer to the stored object if found. NULL if the object
133 * is not found, or if any error occurs, (memory allocation failure,
134 * filesystem error, etc.). The returned data is malloc'ed so the
135 * caller should call free() it when finished.
136 */
137 void *
138 disk_cache_get(struct disk_cache *cache, const cache_key key, size_t *size);
139
140 /**
141 * Store the name \key within the cache, (without any associated data).
142 *
143 * Later this key can be checked with disk_cache_has_key(), (unless the key
144 * has been evicted in the interim).
145 *
146 * Any call to disk_cache_put_key() may cause an existing, random key to be
147 * evicted from the cache.
148 */
149 void
150 disk_cache_put_key(struct disk_cache *cache, const cache_key key);
151
152 /**
153 * Test whether the name \key was previously recorded in the cache.
154 *
155 * Return value: True if disk_cache_put_key() was previously called with
156 * \key, (and the key was not evicted in the interim).
157 *
158 * Note: disk_cache_has_key() will only return true for keys passed to
159 * disk_cache_put_key(). Specifically, a call to disk_cache_put() will not cause
160 * disk_cache_has_key() to return true for the same key.
161 */
162 bool
163 disk_cache_has_key(struct disk_cache *cache, const cache_key key);
164
165 /**
166 * Compute the name \key from \data of given \size.
167 */
168 void
169 disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size,
170 cache_key key);
171
172 #else
173
174 static inline struct disk_cache *
175 disk_cache_create(const char *gpu_name, const char *timestamp,
176 uint64_t driver_flags)
177 {
178 return NULL;
179 }
180
181 static inline void
182 disk_cache_destroy(struct disk_cache *cache) {
183 return;
184 }
185
186 static inline void
187 disk_cache_put(struct disk_cache *cache, const cache_key key,
188 const void *data, size_t size)
189 {
190 return;
191 }
192
193 static inline void
194 disk_cache_remove(struct disk_cache *cache, const cache_key key)
195 {
196 return;
197 }
198
199 static inline uint8_t *
200 disk_cache_get(struct disk_cache *cache, const cache_key key, size_t *size)
201 {
202 return NULL;
203 }
204
205 static inline void
206 disk_cache_put_key(struct disk_cache *cache, const cache_key key)
207 {
208 return;
209 }
210
211 static inline bool
212 disk_cache_has_key(struct disk_cache *cache, const cache_key key)
213 {
214 return false;
215 }
216
217 static inline void
218 disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size,
219 const cache_key key)
220 {
221 return;
222 }
223
224 #endif /* ENABLE_SHADER_CACHE */
225
226 #ifdef __cplusplus
227 }
228 #endif
229
230 #endif /* CACHE_H */