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 */
--