]> www.fi.muni.cz Git - evince.git/commitdiff
Use an specific lock for FontConfig. Hopefully it fixes some crashes
authorCarlos Garcia Campos <carlosgc@gnome.org>
Mon, 18 Dec 2006 15:26:40 +0000 (15:26 +0000)
committerCarlos Garcia Campos <carlosgc@src.gnome.org>
Mon, 18 Dec 2006 15:26:40 +0000 (15:26 +0000)
2006-12-18  Carlos Garcia Campos  <carlosgc@gnome.org>
* backend/ev-document.[ch]: (ev_document_get_fc_mutex),
(ev_document_fc_mutex_lock), (ev_document_fc_mutex_unlock):
* pdf/ev-poppler.cc: (make_thumbnail_for_size):
* shell/ev-jobs.c: (ev_job_render_run), (ev_job_fonts_run):
* shell/ev-view.c: (draw_loading_text):
* shell/ev-window.c: (ev_window_cmd_file_properties):
Use an specific lock for FontConfig. Hopefully it fixes some crashes
related to using FontConfig from different threads.

ChangeLog
backend/ev-document.c
backend/ev-document.h
pdf/ev-poppler.cc
shell/ev-jobs.c
shell/ev-view.c
shell/ev-window.c

index 0b1ba1acd0fe274c0398cbca9e89eea1072c347d..52eb635438efa6cb0800ba6632b04381db258b6e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2006-12-18  Carlos Garcia Campos  <carlosgc@gnome.org>
+
+       * backend/ev-document.[ch]: (ev_document_get_fc_mutex),
+       (ev_document_fc_mutex_lock), (ev_document_fc_mutex_unlock):
+       * pdf/ev-poppler.cc: (make_thumbnail_for_size):
+       * shell/ev-jobs.c: (ev_job_render_run), (ev_job_fonts_run):
+       * shell/ev-view.c: (draw_loading_text):
+       * shell/ev-window.c: (ev_window_cmd_file_properties):
+
+       Use an specific lock for FontConfig. Hopefully it fixes some crashes
+       related to using FontConfig from different threads.
+       
 2006-12-18  Carlos Garcia Campos  <carlosgc@gnome.org>
 
        * shell/ev-view.c: (draw_loading_text):
index 94647c6b571f82f5d1982f317e44051f91f8933a..a951bfa3fa83560534e113ba24ddbe38acc34112 100644 (file)
@@ -28,6 +28,7 @@ static void ev_document_class_init (gpointer g_class);
 
 
 GMutex *ev_doc_mutex = NULL;
+GMutex *ev_fc_mutex = NULL;
 
 #define LOG(x) 
 GType
@@ -89,7 +90,26 @@ ev_document_doc_mutex_unlock (void)
        g_mutex_unlock (ev_document_get_doc_mutex ());
 }
 
+GMutex *
+ev_document_get_fc_mutex (void)
+{
+       if (ev_fc_mutex == NULL) {
+               ev_fc_mutex = g_mutex_new ();
+       }
+       return ev_fc_mutex;
+}
 
+void
+ev_document_fc_mutex_lock (void)
+{
+       g_mutex_lock (ev_document_get_fc_mutex ());
+}
+
+void
+ev_document_fc_mutex_unlock (void)
+{
+       g_mutex_unlock (ev_document_get_fc_mutex ());
+}
 
 gboolean
 ev_document_load (EvDocument  *document,
index 0da5fc7365616052a710c9802dd3f01fbd55d79a..828ca256b799c1a90c3e22e46400d7dfc099a1bd 100644 (file)
@@ -97,10 +97,17 @@ struct _EvDocumentIface
 
 GType          ev_document_get_type       (void);
 GQuark         ev_document_error_quark    (void);
-GMutex        *ev_document_get_doc_mutex  (void);
-void            ev_document_doc_mutex_lock (void);
+
+/* Document mutex */
+GMutex        *ev_document_get_doc_mutex    (void);
+void            ev_document_doc_mutex_lock   (void);
 void            ev_document_doc_mutex_unlock (void);
 
+/* FontConfig mutex */
+GMutex         *ev_document_fc_doc_mutex    (void);
+void            ev_document_fc_mutex_lock   (void);
+void            ev_document_fc_mutex_unlock (void);
+
 EvDocumentInfo *ev_document_get_info       (EvDocument     *document);
 gboolean       ev_document_load            (EvDocument     *document,
                                             const char     *uri,
index d49579e24e983094ed9fec305753df1f5d5129f2..d4372ad6be7cbb1ffa66488676efc127697c6d52 100644 (file)
@@ -1147,9 +1147,11 @@ make_thumbnail_for_size (PdfDocument   *pdf_document,
                                 width, height);
        gdk_pixbuf_fill (pixbuf, 0xffffffff);
 
+       ev_document_fc_mutex_lock ();
        poppler_page_render_to_pixbuf (poppler_page, 0, 0,
                                       width, height,
                                       scale, rotation, pixbuf);
+       ev_document_fc_mutex_unlock ();
        
 
        g_object_unref (poppler_page);
index 3657f6573323ddac45babd5855aee4a03e50659e..e54812c27d131a295956efcb35cc7003ddf973e1 100644 (file)
@@ -316,6 +316,8 @@ ev_job_render_run (EvJobRender *job)
                g_signal_connect (EV_JOB (job)->document, "render_finished",
                                  G_CALLBACK (render_finished_cb), job);
        } else {
+               ev_document_fc_mutex_lock ();
+               
                job->pixbuf = ev_document_render_pixbuf (EV_JOB (job)->document, job->rc);
                if (job->include_links && EV_IS_DOCUMENT_LINKS (EV_JOB (job)->document))
                        job->link_mapping =
@@ -337,7 +339,8 @@ ev_job_render_run (EvJobRender *job)
                                                                   job->rc,
                                                                   &(job->selection_points));
                }
-
+               
+               ev_document_fc_mutex_unlock ();
                EV_JOB (job)->finished = TRUE;
        }
 
@@ -406,7 +409,9 @@ ev_job_fonts_run (EvJobFonts *job)
        ev_document_doc_mutex_lock ();
        
        fonts = EV_DOCUMENT_FONTS (EV_JOB (job)->document);
+       ev_document_fc_mutex_lock ();
        job->scan_completed = !ev_document_fonts_scan (fonts, 20);
+       ev_document_fc_mutex_unlock ();
        
        EV_JOB (job)->finished = TRUE;
 
index e8bcf0bd1d1146a43386bbc7241346fbcc49a10d..097c97be9ac97e7442f612039c30b1a8f4ab6cc6 100644 (file)
@@ -2390,7 +2390,7 @@ draw_loading_text (EvView       *view,
 
        const char *loading_text = _("Loading...");     
 
-       ev_document_doc_mutex_lock ();
+       ev_document_fc_mutex_lock ();
        
        layout = gtk_widget_create_pango_layout (GTK_WIDGET (view), loading_text);
 
@@ -2423,7 +2423,7 @@ draw_loading_text (EvView       *view,
        pango_font_description_free (font_desc);
        g_object_unref (layout);
 
-       ev_document_doc_mutex_unlock ();
+       ev_document_fc_mutex_unlock ();
 }
 
 static void
index 19ad581b3b64ba30b50c73a4845f09407dc366fa..2aaff16108973edb7c8aed0e4c27b455ce5f526b 100644 (file)
@@ -2086,7 +2086,9 @@ ev_window_cmd_file_properties (GtkAction *action, EvWindow *ev_window)
                                              GTK_WINDOW (ev_window));
        }
 
+       ev_document_fc_mutex_lock ();
        gtk_widget_show (ev_window->priv->properties);
+       ev_document_fc_mutex_unlock ();
 }
                                        
 static void