e4bb9dc
From beee2792720f5a55820b9ce8df94d985c6d139d0 Mon Sep 17 00:00:00 2001
e4bb9dc
From: Filippo Argiolas <filippo.argiolas@gmail.com>
e4bb9dc
Date: Wed, 24 Mar 2010 08:52:13 +0100
e4bb9dc
Subject: [PATCH] countdown: move rsvg_init and rsvg_term into main
e4bb9dc
e4bb9dc
Initialize rsvg at startup and clean it up at exit.
e4bb9dc
rsvg_term is particularly subtle as it calls xmlCleanupParser()
e4bb9dc
triggering nasty crashes (e.g. with PulseAudio) with multithread
e4bb9dc
applications.
e4bb9dc
See http://0pointer.de/blog/projects/beware-of-rsvg-term.html for more
e4bb9dc
info.
e4bb9dc
Rsvg loading seems to work even without these functions so I'm not sure
e4bb9dc
it's worth to keep them.
e4bb9dc
e4bb9dc
https://bugzilla.gnome.org/show_bug.cgi?id=592100
e4bb9dc
---
e4bb9dc
 libcheese/cheese-countdown.c |    3 ---
e4bb9dc
 src/cheese.c                 |   10 ++++++++++
e4bb9dc
 2 files changed, 10 insertions(+), 3 deletions(-)
e4bb9dc
e4bb9dc
diff --git a/libcheese/cheese-countdown.c b/libcheese/cheese-countdown.c
e4bb9dc
index b2782e2..d849594 100644
e4bb9dc
--- a/libcheese/cheese-countdown.c
e4bb9dc
+++ b/libcheese/cheese-countdown.c
e4bb9dc
@@ -504,8 +504,6 @@ create_surface_from_svg (GtkWidget *widget, gchar *pcFilename)
e4bb9dc
 
e4bb9dc
   CheeseCountdownPrivate *priv = CHEESE_COUNTDOWN_GET_PRIVATE (widget);
e4bb9dc
 
e4bb9dc
-  rsvg_init ();
e4bb9dc
-
e4bb9dc
   /* load svg-file from disk */
e4bb9dc
   pSvgHandle = rsvg_handle_new_from_file (pcFilename, &pError);
e4bb9dc
   if (!pSvgHandle)
e4bb9dc
@@ -546,7 +544,6 @@ create_surface_from_svg (GtkWidget *widget, gchar *pcFilename)
e4bb9dc
 
e4bb9dc
   /* clean up */
e4bb9dc
   rsvg_handle_free (pSvgHandle);
e4bb9dc
-  rsvg_term ();
e4bb9dc
   cairo_destroy (pContext);
e4bb9dc
 
e4bb9dc
   return pSurface;
e4bb9dc
diff --git a/src/cheese.c b/src/cheese.c
e4bb9dc
index 5e1c952..f143ecf 100644
e4bb9dc
--- a/src/cheese.c
e4bb9dc
+++ b/src/cheese.c
e4bb9dc
@@ -110,6 +110,10 @@ main (int argc, char **argv)
e4bb9dc
   g_thread_init (NULL);
e4bb9dc
   gdk_threads_init ();
e4bb9dc
 
e4bb9dc
+  /* initialize rsvg */
e4bb9dc
+  /* needed to load the camera icon for the countdown widget */
e4bb9dc
+  rsvg_init ();
e4bb9dc
+
e4bb9dc
   g_set_application_name (_("Cheese"));
e4bb9dc
 
e4bb9dc
   context = g_option_context_new (N_("- Take photos and videos with your webcam, with fun graphical effects"));
e4bb9dc
@@ -159,5 +163,11 @@ main (int argc, char **argv)
e4bb9dc
   gtk_main ();
e4bb9dc
   gdk_threads_leave ();
e4bb9dc
 
e4bb9dc
+  /* cleanup rsvg */
e4bb9dc
+  /* Note: this function is bad with multithread applications as it
e4bb9dc
+   * calls xmlCleanupParser() and should be only called right before
e4bb9dc
+   * exit */
e4bb9dc
+  rsvg_term ();
e4bb9dc
+
e4bb9dc
   return 0;
e4bb9dc
 }
e4bb9dc
-- 
e4bb9dc
1.6.6.1