From: Stefan Dösinger stefan@codeweavers.com
FIXME: Calling put/get from the enum callback will deadlock with a unix build that uses posix mutexes instead of win32 critical sections. --- libs/vkd3d/cache.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d/cache.c b/libs/vkd3d/cache.c index 2b692c343..de08c1b2c 100644 --- a/libs/vkd3d/cache.c +++ b/libs/vkd3d/cache.c @@ -194,6 +194,14 @@ static uint64_t hash_key(const void *key, size_t size) return ret; }
+static void vkd3d_shader_cache_lock(struct vkd3d_shader_cache *cache) +{ + if (cache->desc.flags & VKD3D_SHADER_CACHE_FLAGS_NO_SERIALIZE) + return; + + vkd3d_mutex_lock(&cache->lock); +} + static bool vkd3d_shader_cache_trylock(struct vkd3d_shader_cache *cache) { if (cache->desc.flags & VKD3D_SHADER_CACHE_FLAGS_NO_SERIALIZE) @@ -353,8 +361,25 @@ void vkd3d_shader_cache_delete_on_destroy(struct vkd3d_shader_cache *cache) FIXME("Stub!\n"); }
+struct vkd3d_shader_cache_enum_ctx +{ + vkd3d_shader_cache_traverse_func *cb; + void *context; +}; + +static void vkd3d_shader_cache_trampoline(struct rb_entry *entry, void *context) +{ + struct vkd3d_shader_cache_enum_ctx *ctx = context; + struct shader_cache_entry *e = RB_ENTRY_VALUE(entry, struct shader_cache_entry, entry); + ctx->cb(e->payload, e->d.key_size, e->payload + e->d.key_size, e->d.value_size, ctx->context); +} + void vkd3d_shader_cache_enumerate(struct vkd3d_shader_cache *cache, vkd3d_shader_cache_traverse_func *cb, void *context) { - FIXME("%p, %p, %p: stub!\n", cache, cb, context); + struct vkd3d_shader_cache_enum_ctx ctx = {cb, context}; + + vkd3d_shader_cache_lock(cache); + rb_for_each_entry(&cache->tree, vkd3d_shader_cache_trampoline, &ctx); + vkd3d_shader_cache_unlock(cache); }