mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-05 01:50:25 +01:00
glsl: Add locking to builtin_builder singleton
Consider a multithreaded program with two contexts A and B, and the
following scenario:
1. Context A calls initialize(), which allocates mem_ctx and starts
building built-ins.
2. Context B calls initialize(), which sees mem_ctx != NULL and assumes
everything is already set up. It returns.
3. Context B calls find(), which fails to find the built-in since it
hasn't been created yet.
4. Context A finally finishes initializing the built-ins.
This will break at step 3. Adding a lock ensures that subsequent
callers of initialize() will wait until initialization is actually
complete.
Similarly, if any thread calls release while another thread is still
initializing, or calling find(), the mem_ctx/shader would get free'd while
from under it, leading to corruption or use-after-free crashes.
Fixes sporadic failures in Piglit's glx-multithread-shader-compile.
Bugzilla: https://bugs.freedesktop.org/69200
Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Cc: "10.1 10.0" <mesa-stable@lists.freedesktop.org>
(cherry picked from commit b47d231526)
This commit is contained in:
parent
62a358892f
commit
69bd4ed017
1 changed files with 10 additions and 1 deletions
|
|
@ -4100,6 +4100,7 @@ builtin_builder::_mid3(const glsl_type *type)
|
|||
|
||||
/* The singleton instance of builtin_builder. */
|
||||
static builtin_builder builtins;
|
||||
_glthread_DECLARE_STATIC_MUTEX(builtins_lock);
|
||||
|
||||
/**
|
||||
* External API (exposing the built-in module to the rest of the compiler):
|
||||
|
|
@ -4108,20 +4109,28 @@ static builtin_builder builtins;
|
|||
void
|
||||
_mesa_glsl_initialize_builtin_functions()
|
||||
{
|
||||
_glthread_LOCK_MUTEX(builtins_lock);
|
||||
builtins.initialize();
|
||||
_glthread_UNLOCK_MUTEX(builtins_lock);
|
||||
}
|
||||
|
||||
void
|
||||
_mesa_glsl_release_builtin_functions()
|
||||
{
|
||||
_glthread_LOCK_MUTEX(builtins_lock);
|
||||
builtins.release();
|
||||
_glthread_UNLOCK_MUTEX(builtins_lock);
|
||||
}
|
||||
|
||||
ir_function_signature *
|
||||
_mesa_glsl_find_builtin_function(_mesa_glsl_parse_state *state,
|
||||
const char *name, exec_list *actual_parameters)
|
||||
{
|
||||
return builtins.find(state, name, actual_parameters);
|
||||
ir_function_signature * s;
|
||||
_glthread_LOCK_MUTEX(builtins_lock);
|
||||
s = builtins.find(state, name, actual_parameters);
|
||||
_glthread_UNLOCK_MUTEX(builtins_lock);
|
||||
return s;
|
||||
}
|
||||
|
||||
gl_shader *
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue