mesa: Fix locking of GLsync objects.
authorSteinar H. Gunderson <sesse@google.com>
Tue, 2 Feb 2016 00:16:51 +0000 (01:16 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 5 Feb 2016 16:18:17 +0000 (17:18 +0100)
commitfeb53912f8d8c29594a9fdff914d78bb36d6d56b
tree4ca9c61e7609a67a65789ad85202376b768f2df0
parent156e81f305b19f62b4d6ea98bf44a951e89dc947
mesa: Fix locking of GLsync objects.

GLsync objects had a race condition when used from multiple threads
(which is the main point of the extension, really); it could be
validated as a sync object at the beginning of the function, and then
deleted by another thread before use, causing crashes. Fix this by
changing all casts from GLsync to struct gl_sync_object to a new
function _mesa_get_and_ref_sync() that validates and increases
the refcount.

In a similar vein, validation itself uses _mesa_set_search(), which
requires synchronization -- it was called without a mutex held, causing
spurious error returns and other issues. Since _mesa_get_and_ref_sync()
now takes the shared context mutex, this problem is also resolved.

Fixes bug #92757, found while developing Nageru, my live video mixer
(due for release at FOSDEM 2016).

v2: Marek: silence warnings, fix declaration after code

Signed-off-by: Steinar H. Gunderson <sesse@google.com>
Cc: "11.0 11.1" <mesa-stable@lists.freedesktop.org>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/main/objectlabel.c
src/mesa/main/shared.c
src/mesa/main/syncobj.c
src/mesa/main/syncobj.h