I looked at the implementation of cairo-ft-font.c and it seems that there are huge multi-threading violations in cairo. The reason is that FreeType API documentation clearly states:
In multi-threaded applications, make sure that the same FT_Library object or any of its children doesn't get accessed in parallel.
Cairo initializes FT_Library for its font map and there's a lock for that, however it's only used for font map manipulations, the actual FT_ library calls are completely unprotected with that lock, although they should be! What adds to the injury is that cairo-ft-font.c even has this comment on one of its functions:
You must be careful when using this function in a library or in a
threaded application, because freetype's design makes it unsafe to
call freetype functions simultaneously from multiple threads, (even
if using distinct FT_Face objects)
I looked at the implementation of cairo-ft-font.c and it seems that there are huge multi-threading violations in cairo. The reason is that FreeType API documentation clearly states:
In multi-threaded applications, make sure that the same FT_Library object or any of its children doesn't get accessed in parallel.
Cairo initializes FT_Library for its font map and there's a lock for that, however it's only used for font map manipulations, the actual FT_ library calls are completely unprotected with that lock, although they should be! What adds to the injury is that cairo-ft-font.c even has this comment on one of its functions:
You must be careful when using this function in a library or in a
threaded application, because freetype's design makes it unsafe to
call freetype functions simultaneously from multiple threads, (even
if using distinct FT_Face objects)