As I did not get any answers I just resend my last proposal.
On 21.05.2013, at 20:43, Roland Peffer wrote:
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
_______________________________________________
grilo-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/grilo-list
_______________________________________________
grilo-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/grilo-list