g_idle_add patch proposal



Hi
I noticed that when I tried to resolve an url of an url media object from vimeo or youtube my program often 
got frozen for a few seconds.
After stepping through the code I realized that the idle functions called by g_add_idle and  g_add_idle_full 
in grl-source.c and other parts ended up in blocking functions like curl_perform_easy.
At least the  clutter_stage repainting sources also running on the same GMainContext got blocked that way.

I found a workaround for that that should not change the normal behavior:
I added our own grl_idle_add /grl_idle_add_full functions in grl-util.h/.c that behave exactly the same like 
the glib implementations,
except if a GMainContext was created in a separate thread and activated by 
g_main_context_push_thread_default(thread_context);,
then calling grl_resolve or other grill operations from that thread will not block the Default Main Context 
anymore.

Here is what I did: 

1) Change g_idle_add and  grl_idle_add_full in every grilo file  in the libray an d plugin section like 
grilo-0.2.6/src/grl-source.c
grilo-plugins-0.2.7/src/vimeo/gvimeo.c
grilo-plugins-0.2.7/src/apple-trailers/grl-apple-trailers.c
etc. ( just search for it )

Then add these snippets to 
grl-util.h: -------------------------------------------
guint
grl_idle_add_full (gint            priority,
                 GSourceFunc     function,
                 gpointer        data,
                 GDestroyNotify  notify);

guint
grl_idle_add  (GSourceFunc     function,
               gpointer        data);
and grl-util.c:--------------------------------------------

guint
grl_idle_add_full (gint            priority,
                 GSourceFunc     function,
                 gpointer        data,
                 GDestroyNotify  notify)
{
  GSource *source;
  guint id;
  GMainContext *main_context =
      g_main_context_get_thread_default();
  g_return_val_if_fail (function != NULL, 0);

  source = g_idle_source_new ();

  if (priority != G_PRIORITY_DEFAULT_IDLE)
    g_source_set_priority (source, priority);

  g_source_set_callback (source, function, data, notify);
  id = g_source_attach (source, main_context);
  g_source_unref (source);

  return id;
}

guint
grl_idle_add  (GSourceFunc     function,
             gpointer        data)
{

  return grl_idle_add_full(G_PRIORITY_DEFAULT_IDLE,function,data, NULL);
}
--------------------------------------------

Now the software works smooth without any glitches!

I hope you can add this for the next release!

Roland




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]