[cairo] fixing Cairo's FreeType multi-threaded usage
David Turner
david at freetype.org
Thu Apr 5 00:08:34 PDT 2007
Hello everyone,
I would *really* appreciate if you could review or even integrate my
patch into the main Cairo git tree. Of course, I'm open to suggestions
or changes if needed.
I know this is quite a large patchset, but I plan even more improvements
and bugfixes to Cairo's font/glyph handling; however it's probably better
to submit them later, to avoid making the patchset even more complex that
it currently is.
Regards, and thanks in advance,
- David Turner
On Wed, 4 Apr 2007 19:00:52 +0200 (CEST), "Jan Slupski" <jslupski at juljas.net> said:
>
> Next issue:
>
> After brief looking at 1.4.2 it seems that David patches weren't merged.
> Are there any plans to do so?
>
> Without this fix, heavy multithread testing still fails after few hours
> (at least used to fail at Cairo 1.3.16).
>
> Thanks,
> Jan
>
> Link to final version of the patch:
> http://lists.freedesktop.org/archives/cairo/2007-March/009924.html
>
>
> On Wed, 28 Feb 2007, David Turner wrote:
>
> > Hello,
> >
> > here's the first version of my patches to fix Cairo's usage of FreeType with multiple
> > threads. It's rather big, so I'll summarize things here a little:
> >
> > - it's more or less a complete rewrite of the functionality, but it is
> > API and ABI compatible with the original code.
> >
> > - there is no need to modify any client code, except the one using the broken
> > cairo_ft_scaled_font_lock_face() and cairo_ft_scaled_font_unlock_face(),
> > which probably means only Pango at the moment.
> >
> > normal users of Cairo should now be lock-free in all FreeType-related operations.
> > no need for thread-specific list and other hacks like that by the way.
> >
> > - even if you use cairo_ft_scaled_font_lock_face() and cairo_ft_scaled_font_unlock_face(),
> > you should be free from deadlocks with the rest of Cairo. that's because the returned
> > FT_Face objects are allocated into a different library instance than the one used by
> > the rest of the library.
> >
> > Of course, all hell breaks loose if two threads use FT_Face objects returned by
> > cairo_ft_scaled_font_lock_face() at the same time, even if they're not the same
> > FT_Face.
> >
> > The upgrade path to sanity is to use the functions named:
> >
> > cairo_freetype_state_lock()
> > cairo_freetype_state_get_face()
> > cairo_freetype_state_get_size()
> > cairo_freetype_state_unlock()
> >
> > defined and documented in the new file cairo-freetype-state.c
> >
> >
> > - there are now two backends: a FreeType-specific one, and a FontConfig-specific one.
> > the only difference is that the FontConfig one is capable of implementing the
> > toy interface, and is thus still the default on Unix.
> >
> > the idea is to be able to compile the FreeType backend on platforms where FontConfig
> > is not available or desirable. Of course, the toy interface would then be implemented
> > by the default backend for the platform, or simply not at all.
> >
> > - there are thus two additionnal public header files: "cairo-freetype.h" and
> > "cairo-fontconfig.h", with corresponding functions using the surprisingly long
> > "cairo_freetype_" and "cairo_fontconfig_" prefixes
> >
> > - this was done to avoid any conflict with the existing code and public headers.
> > "cairo-ft.h" is still there and its functions are fully supported even if we
> > can't make thread-safety guarantees for "locked" FT_Face usage.
> >
> > - the source code "cairo-ft-font.c" is still there, but is not compiled anymore.
> > this is essentially for comparison purposes.
> >
> > - there are quite a few new source files as well:
> >
> > cairo-freetype-state.c (thread-safe FT_Face/FT_Size management)
> > cairo-freetype-font.c (FreeType font backend)
> > cairo-freetype-glyph.c (glyph loading + rendering + filtering)
> > cairo-freetype.h (public FreeType backend APIs)
> > cairo-freetype-private.h (guess what)
> > cairo-fontconfig.h (public FontConfig backend APIs)
> > cairo-fontconfig.c (tiny FontConfig font backend)
> > cairo-ft.c (stubs to implement original cairo_ft_ functions)
> >
> > - I'd be happy to use shorter prefixes like "cairo_ft_" and "cairo_fc_" once
> > Carl is happy with the implementation provided here. I wanted to be able to
> > easily compare the new and the old code, and the different prefixes just
> > makes things a lot easier there.
> >
> > - the cairo_ft_ functions do implement the current Cairo behaviour regarding
> > font options (i.e. the FontConfig backend ignores user-provided options for
> > antialiased setting, extracting those from the original FcPattern instead)
> >
> > since I still don't understand why this is a good thing, the cairo_freetype_
> > and cairo_fontconfig_ equivalent functions to do implement this "feature",
> > but this can easily be changed.
> >
> > (I plan to make a different email to discuss this issue in more details)
> >
> > - there is also a RATIONALE file that explains how certain things are implemented,
> > that should make understanding the changes easier
> >
> > Finally, all test cases pass, except the ft-text-vertical-layout-* ones, but
> > I believe it's because I don't have the relevant font files installed on my
> > machine. Will check later.
> >
> > There has been a lot of shuffle during the intermediate commits that led to this
> > patchset, so I recommend only studying the final changes, instead of the individual
> > ones.
> >
> > Voila, you can find all this here:
> >
> > http://david.freetype.org/cairo/fix-freetype-usage-1.patchset.bz2
> > http://david.freetype.org/cairo/RATIONALE
> >
> >
> > Hope this helps,
> >
> > - David Turner
> > - The FreeType Project (www.freetype.org)
> > _______________________________________________
> > cairo mailing list
> > cairo at cairographics.org
> > http://cairographics.org/cgi-bin/mailman/listinfo/cairo
> >
>
> _ _ _ _ _____________________________________________
> | |_| |\ | S L U P S K I jslupski at juljas.net
> |_| | | | \| http://juljas.net/
More information about the cairo
mailing list