[Spice-devel] [PATCH spice-gtk 11/13] coroutine: reference object when signaling

Marc-André Lureau mlureau at redhat.com
Wed Nov 12 09:10:26 PST 2014



----- Original Message -----
> Hey,
> 
> On Sun, Nov 09, 2014 at 05:31:43PM +0100, Marc-André Lureau wrote:
> > Before the signal is acutally emitted, the channel may be
> 
> 'actually'
> 
> > released. Similarly to g_signal_emit, take a reference before yielding
> > to main context.
> 
> I would drop the "similarly to g_signal_emit" as your purpose is most
> likely different. The ref is needed here as the signal emission is
> async, so code can run before the signal emission, but g_signal_emit is
> synchronous.
> 
> I assume the scenario you want to protect against is
> - (coroutine context)g_coroutine_signal_emit is called
>   - the signal emission is scheduled in an idle with g_idle_add
>   - coroutine_yield() is called
> - (main context)code runs which drops the last ref on the channel
> - (main context)idle runs and tries to emit the signal
> 
> 
> Patch looks good if this is the correct scenario.

Yes, I maintain "similarly", because we want to maintain object alive during g_coroutine_signal_emit(). I think it is thus appropriate here.

> Christophe
> 
> > ---
> >  gtk/gio-coroutine.c | 5 ++++-
> >  1 file changed, 4 insertions(+), 1 deletion(-)
> > 
> > diff --git a/gtk/gio-coroutine.c b/gtk/gio-coroutine.c
> > index c903bd2..c866e15 100644
> > --- a/gtk/gio-coroutine.c
> > +++ b/gtk/gio-coroutine.c
> > @@ -222,9 +222,11 @@ g_coroutine_signal_emit(gpointer instance, guint
> > signal_id,
> >      if (coroutine_self_is_main()) {
> >          g_signal_emit_valist(instance, signal_id, detail, data.var_args);
> >      } else {
> > +        g_object_ref(instance);
> >          g_idle_add(emit_main_context, &data);
> >          coroutine_yield(NULL);
> >          g_warn_if_fail(data.notified);
> > +        g_object_unref(instance);
> >      }
> >  
> >      va_end (data.var_args);
> > @@ -253,7 +255,7 @@ void g_coroutine_object_notify(GObject *object,
> >          g_object_notify(object, property_name);
> >      } else {
> >  
> > -        data.instance = object;
> > +        data.instance = g_object_ref(object);
> >          data.caller = coroutine_self();
> >          data.propname = (gpointer)property_name;
> >          data.notified = FALSE;
> > @@ -268,5 +270,6 @@ void g_coroutine_object_notify(GObject *object,
> >           */
> >          coroutine_yield(NULL);
> >          g_warn_if_fail(data.notified);
> > +        g_object_unref(object);
> >      }
> >  }
> > --
> > 1.9.3
> > 
> > _______________________________________________
> > Spice-devel mailing list
> > Spice-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/spice-devel
> 


More information about the Spice-devel mailing list