diff -ur cairo-1.3.14/src/cairo-ft-font.c cairo-1.3.14.new/src/cairo-ft-font.c --- cairo-1.3.14/src/cairo-ft-font.c 2007-02-14 08:45:15.000000000 +0100 +++ cairo-1.3.14.new/src/cairo-ft-font.c 2007-02-27 01:24:36.713379639 +0100 @@ -504,6 +504,10 @@ return (unscaled->lock_count == 0 && unscaled->face); } +const char * CAIRO_MUTEX_LOCK_FILE; +int CAIRO_MUTEX_LOCK_LINE; +int CAIRO_MUTEX_LOCK_ERR; + /* Ensures that an unscaled font has a face object. If we exceed * MAX_OPEN_FACES, try to close some. * @@ -513,10 +517,19 @@ FT_Face _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled) { + int err; cairo_ft_unscaled_font_map_t *font_map; FT_Face face = NULL; CAIRO_MUTEX_LOCK (unscaled->mutex); + if (CAIRO_MUTEX_LOCK_ERR == EDEADLK) { + fprintf (stderr, + "Deadlock occurred in _cairo_ft_unscaled_font_lock_face.\n" + "The original locker was %s:%d\n", + CAIRO_MUTEX_LOCK_FILE, CAIRO_MUTEX_LOCK_LINE); + exit (1); + } + unscaled->lock_count++; if (unscaled->face) diff -ur cairo-1.3.14/src/cairoint.h cairo-1.3.14.new/src/cairoint.h --- cairo-1.3.14/src/cairoint.h 2007-02-14 06:54:49.000000000 +0100 +++ cairo-1.3.14.new/src/cairoint.h 2007-02-27 01:16:12.221343063 +0100 @@ -46,6 +46,8 @@ #ifndef _CAIROINT_H_ #define _CAIROINT_H_ +#include + #if HAVE_CONFIG_H #include "config.h" #endif @@ -134,11 +136,19 @@ #define __attribute__(x) #endif +extern const char * CAIRO_MUTEX_LOCK_FILE; +extern int CAIRO_MUTEX_LOCK_LINE; +extern int CAIRO_MUTEX_LOCK_ERR; + #if HAVE_PTHREAD_H # include -# define CAIRO_MUTEX_DECLARE(name) static pthread_mutex_t name = PTHREAD_MUTEX_INITIALIZER -# define CAIRO_MUTEX_DECLARE_GLOBAL(name) pthread_mutex_t name = PTHREAD_MUTEX_INITIALIZER -# define CAIRO_MUTEX_LOCK(name) pthread_mutex_lock (&name) +# define CAIRO_MUTEX_DECLARE(name) static pthread_mutex_t name = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP +# define CAIRO_MUTEX_DECLARE_GLOBAL(name) pthread_mutex_t name = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP +# define CAIRO_MUTEX_LOCK(name) do { \ + CAIRO_MUTEX_LOCK_ERR = pthread_mutex_lock (&name); \ + CAIRO_MUTEX_LOCK_FILE = __FILE__; \ + CAIRO_MUTEX_LOCK_LINE = __LINE__; \ +} while (0) # define CAIRO_MUTEX_UNLOCK(name) pthread_mutex_unlock (&name) typedef pthread_mutex_t cairo_mutex_t; # define CAIRO_MUTEX_INIT(mutex) pthread_mutex_init ((mutex), NULL) diff -ur cairo-1.3.14/src/Makefile.am cairo-1.3.14.new/src/Makefile.am --- cairo-1.3.14/src/Makefile.am 2007-02-02 01:40:12.000000000 +0100 +++ cairo-1.3.14.new/src/Makefile.am 2007-02-27 01:16:12.167351300 +0100 @@ -246,7 +246,7 @@ libcairo_la_LDFLAGS = -version-info @VERSION_INFO@ -no-undefined $(export_symbols) -INCLUDES = -I$(srcdir) -I$(top_srcdir)/pixman/src $(CAIRO_CFLAGS) +INCLUDES = -D_GNU_SOURCE -I$(srcdir) -I$(top_srcdir)/pixman/src $(CAIRO_CFLAGS) libcairo_la_LIBADD = $(top_builddir)/pixman/src/libpixman.la $(CAIRO_LIBS) $(noinst_LTLIBRARIES)