[cairo] New per-scaled_font mutex to fix locking bugs

Bill Spitzak spitzak at d2.com
Mon Feb 5 18:08:24 PST 2007

Carl Worth wrote:

> For win32, I took a guess and came up with the following
> 	typedef CRITICAL_SECTION cairo_mutex_t;
> 	# define CAIRO_MUTEX_INIT(mutex) InitializeCriticalSection (mutex)
> 	# define CAIRO_MUTEX_FINI(mutex) DeleteCriticalSection (mutex)
> The only thing I'm unsure of there is the NIL_INITIALIZER. This is
> only used when initializing the mutex for a nil surface, so the value
> won't ever be looked at, but it does need to compile at least.

I assumme your intention is to be able to type:

	static cairo_mutex_t foo = CAIRO_MUTEX_NIL_INITIALIZER;

Unfortunately as far as I can tell this is quite impossible. Windows 
insists you call InitializeCriticalSection(&cs), the mutex will not work 
without this code being executed because the existence, rather than the 
use, of the mutex is recorded by the system. The only proper way to do 
this is to put another lock around it, which is impossible because you 
would require an infinite recursion of locks. They could fix it by 
providing at least one CriticalSection object that you know is already 
initialized, but I have never heard of one. Normal solution is to some 
how provide some "init()" function and whatever necessary kludges are 
needed to make sure this is run before any attempt is made to lock anything.

More information about the cairo mailing list