File rrdtool-1.4.7-pango-fontmap-threading-issue.patch of Package rrdtool.6701

@@ -, +, @@ 
---
 src/Makefile.am |  1 +
 src/mutex.h     | 23 +++++++++++++++++++++++
 src/rrd_graph.c | 12 ++++++++++--
 src/rrd_graph.h |  2 ++
 4 files changed, 36 insertions(+), 2 deletions(-)
 create mode 100644 src/mutex.h
--- a/src/Makefile.am	
+++ a/src/Makefile.am	
@@ -56,6 +56,7 @@ endif
 noinst_HEADERS = \
 	unused.h \
         gettext.h \
+	mutex.h \
 	rrd_getopt.h rrd_parsetime.h \
 	rrd_config_bottom.h rrd_i18n.h \
 	rrd_format.h rrd_tool.h rrd_xport.h rrd.h rrd_rpncalc.h \
--- a/src/mutex.h	
+++ a/src/mutex.h	
@@ -0,0 +1,23 @@ 
+/*
+ *  mutex.h - Cross platform mutex
+ */
+
+#ifndef MUTEX_H_B13C67AB432C4C39AF823A339537CA40
+#define MUTEX_H_B13C67AB432C4C39AF823A339537CA40
+
+#include <pthread.h>
+
+#define mutex_t            pthread_mutex_t
+#define MUTEX_INITIALIZER  PTHREAD_MUTEX_INITIALIZER
+
+#define mutex_init(mutex)    pthread_mutex_init((mutex), NULL)
+#define mutex_lock(mutex)    pthread_mutex_lock((mutex))
+#define mutex_unlock(mutex)  pthread_mutex_unlock((mutex))
+#define mutex_cleanup(mutex) pthread_mutex_destroy((mutex))
+
+#endif /* MUTEX__H */
+
+/*
+ * vim: set sw=2 sts=2 ts=8 et fdm=marker :
+ */
+
--- a/src/rrd_graph.c	
+++ a/src/rrd_graph.c	
@@ -354,9 +354,11 @@ int im_free(
         free(im->rendered_image);
     }
 
+    mutex_lock(im->fontmap_mutex);
     if (im->layout) {
         g_object_unref (im->layout);
     }
+    mutex_unlock(im->fontmap_mutex);
 
     if (im->surface)
         cairo_surface_destroy(im->surface);
@@ -4064,6 +4066,7 @@ void rrd_graph_init(
     unsigned int i;
     char     *deffont = getenv("RRD_DEFAULT_FONT");
     static PangoFontMap *fontmap = NULL;
+    static mutex_t fontmap_mutex = MUTEX_INITIALIZER;
     PangoContext *context;
 
 #ifdef HAVE_TZSET
@@ -4138,6 +4141,7 @@ void rrd_graph_init(
 
     im->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 10, 10);
     im->cr = cairo_create(im->surface);
+    im->fontmap_mutex = &fontmap_mutex;
 
     for (i = 0; i < DIM(text_prop); i++) {
         im->text_prop[i].size = -1;
@@ -4145,8 +4149,10 @@ void rrd_graph_init(
         rrd_set_font_desc(im,i, deffont ? deffont : text_prop[i].font,text_prop[i].size);
     }
 
+    mutex_lock(im->fontmap_mutex);
+
     if (fontmap == NULL){
-        fontmap = pango_cairo_font_map_get_default();
+        fontmap = pango_cairo_font_map_new();
     }
 
     context =  pango_cairo_font_map_create_context((PangoCairoFontMap*)fontmap);
@@ -4167,7 +4173,7 @@ void rrd_graph_init(
         (im->font_options, CAIRO_HINT_METRICS_ON);
     cairo_font_options_set_antialias(im->font_options, CAIRO_ANTIALIAS_GRAY);
 
-
+    mutex_unlock(im->fontmap_mutex);
 
     for (i = 0; i < DIM(graph_col); i++)
         im->graph_col[i] = graph_col[i];
@@ -4688,8 +4694,10 @@ void rrd_graph_options(
         if (status != 0) return;
     }
 
+    mutex_lock(im->fontmap_mutex);
     pango_cairo_context_set_font_options(pango_layout_get_context(im->layout), im->font_options);
     pango_layout_context_changed(im->layout);
+    mutex_unlock(im->fontmap_mutex);
 
 
 
--- a/src/rrd_graph.h	
+++ a/src/rrd_graph.h	
@@ -25,6 +25,7 @@ 
 
 #include "rrd_tool.h"
 #include "rrd_rpncalc.h"
+#include "mutex.h"
 
 #ifdef WIN32
 #  include <windows.h>
@@ -283,6 +284,7 @@ typedef struct image_desc_t {
     PangoLayout *layout; /* the pango layout we use for writing fonts */
     rrd_info_t *grinfo; /* root pointer to extra graph info */
     rrd_info_t *grinfo_current; /* pointing to current entry */
+    mutex_t *fontmap_mutex; /* Mutex for locking the global fontmap */
 } image_desc_t;
 
 /* Prototypes */
-- 

openSUSE Build Service is sponsored by