Thanks Jonathan! I think as a first pass it makes sense to just stick all the font stuff behind a lock (which we only acquire from workers). If it shows up in profiles, we can figure out which paths we want to make thread-safe.
On Wed, Dec 14, 2016 at 6:01 AM, Jonathan Kew <[email protected]> wrote: > Hi Bobby, > > On 13/12/2016 17:34, Bobby Holley wrote: > >> Hi Jonathan, >> >> For Stylo to compute values for 'ex' and 'ch' units, it needs access to >> font metrics from the parallel worker threads. I've heard that font >> metrics are generally not thread-safe in Gecko, so I'm trying to figure >> out next steps, and have a few questions: >> >> (1) How not-thread-safe is the font metric stuff? If we just need >> trivial stuff like the things mentioned above, will we still run into >> problems? >> > > In principle, the answer may differ between font back-ends, as we > ultimately rely on platform APIs to access fonts. But I think the answer is > that font metric stuff -can- be made thread-safe without too much > difficulty. > > My understanding is that both Core Text & Core Graphics on macOS and > DirectWrite & GDI on Windows can safely be used to read font metrics from > multiple threads. > > Note, however, that the FreeType docs say that "[a]n ‘FT_Face’ object can > only be safely used from one thread at a time", so multiple concurrent > workers all asking for metrics may be problematic on Linux and Android. > > The current Gecko code in gfx/thebes that deals with metrics is -not- > thread-safe, however, as it includes a bunch of caching that looks like > it'd be unsafe (e.g. gfxGlyphExtents includes an nsTHashtable where it > stores extents, and this would get very confused if two threads > simultaneously tried to update it). We could presumably go through that > code and make it thread-safe (for some cost), if that would be an overall > win. > > (Actually, you're probably less interested in gfxGlyphExtents at this > stage; that would be relevant to textRun construction rather than style > processing. But initializing the metrics of an individual gfxFont object is > also not thread-safe, AFAICS.) > > >> (2) Assuming that the information we need does indeed require >> non-threadsafe calls, can you tell us whether those calls are strictly >> main-thread-only, or whether it's enough to simply avoid concurrency? We >> block the main thread during style traversal, so we could stick a mutex >> around the font metrics stuff and only acquire that mutex during >> parallel traversal (leaving main-thread callpaths untouched). We could >> then also cache the metrics we need in TLS to further-reduce the >> synchronization cost. >> > > I'm not aware of any main-thread-only calls involved here; I believe > you'll be fine getting metrics on a worker thread. The two issues we'll > need to be careful of are the currently non-thread-safe caching in gfxFont > etc., and the FreeType restriction on concurrent use of an FT_Face. If we > make the gfxFont caching thread-safe, then AFAIK you could have multiple > concurrent threads getting font metrics on both macOS and Windows. > > > Besides getting metrics, I suspect you're also going to be interested in > querying the list of available fonts (so that you can find the best > matching face for a given family/weight/stretch/style/etc combination). > That will also need to be looked at, because the current Gecko font-list > code loads the faces within each family lazily (and modification of the > gfxFontFamily to add faces isn't thread-safe). > > So really, this comes before the question about font metrics: you can't > get font metrics until you know which font you're dealing with, so you need > to resolve the font-* properties to a specific face, and currently you > can't safely do that concurrently from multiple threads. (AFAIK it should > be OK to do it from a single worker thread if the main thread is blocked.) > > HTH, > > JK > > _______________________________________________ dev-tech-layout mailing list [email protected] https://lists.mozilla.org/listinfo/dev-tech-layout

