[Spice-devel] [spice v10 10/27] server: Make the RedDrawable refcount thread-safe
Francois Gouget
fgouget at codeweavers.com
Wed Mar 2 13:10:49 UTC 2016
On Wed, 2 Mar 2016, Frediano Ziglio wrote:
> >
> > Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
> > ---
> >
> > In theory this could be needed by the next patch.
> >
>
> Are you saying that now compression is done in another thread?
Nothing has changed with regards to threading. My understanding is that
GStreamer always forks its own thread(s) to handle the pipeline.
The difference is that before the pipeline elements were not touching
the RedDrawable refcount and now they do.
Furthermore, as explained in the next patch, I think that all the
incrementing and decrementing of the RedDrawable refcount will happen
during the encode_frame() call, i.e. there will be no race condition
since the main thread will be blocked in the gst_app_sink_pull_sample()
call.
However this relies on reasonable assumptions on how the pipeline
elements behave, for instance that the videoconvert element will
actually have to convert the frame and thus will release the input
buffer as soon as that's done. But the goal of changing from the
previous approach to this one is to get rid of these assumptions and
thus ensure this works even if the buffer we push to the pipeline is
freed some time after gst_app_sink_pull_sample() returns. If that
happens then we could get a race condition. Hence this patch.
[...]
> > void red_drawable_unref(RedDrawable *red_drawable)
> > {
> > - if (--red_drawable->refs) {
> > + gint old_refs;
> > + do {
> > + old_refs = red_drawable->refs;
> > + } while (!g_atomic_int_compare_and_exchange(&red_drawable->refs,
> > old_refs, old_refs - 1));
>
> This code looks a bit odd. Usually there is a function to do it. 486
> introduced xadd instruction and GCC have atomic built-ins.
> Personally I would like to have a syntax that allows to use C11 instead of
> some library specific ones.
This is loosely modeled after the GObject refcount code, though that
code is much more complex due to floating and weak references. I think I
wanted to use g_atomic_int_dec_and_test() in another context and
concluded I could not use it there, but here it seems like it would work
just fine.
We could use the C11 atomic operations directly but GLib's gatomic.h
header does that for us and makes it more portable.
--
Francois Gouget <fgouget at codeweavers.com>
More information about the Spice-devel
mailing list