Question regarding cairo, freetype and multi-threaded execution.

Joseph Adamski-Smith <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <CAA_xcYHoKg5UMzoKjNAkPJ+Wjs2NmF19aJEkmDkVV51uXon3NQ@mail.gmail.com>
I have a crash inside freetype and it seems to be related to how cairo uses
freetype. But I am not very familiar to say for sure.

The crash call stack is below

current thread: t@121
=>[1] af_latin_hints_compute_edges(*hints = 0x128623eb0*, dim =
AF_DIMENSION_HORZ), line 1039 in "aflatin.c"
  [2] af_latin_hints_detect_features(hints = 0x128623eb0, dim =
AF_DIMENSION_HORZ), line 1207 in "aflatin.c"
  [3] af_latin_hints_apply(hints = 0x128623eb0, outline = 0x100cb61b8,
metrics = 0x125a15f80), line 1951 in "aflatin.c"
  [4] af_loader_load_g(loader = 0x128623e98, scaler = 0xffffffff27edefb8,
glyph_index = 23U, load_flags = 2561, depth = 0), line 165 in "afloader.c"
  [5] af_loader_load_glyph(loader = 0x128623e98, face = 0x1282a00c0, gindex
= 23U, load_flags = 2561U), line 484 in "afloader.c"
  [6] af_autofitter_load_glyph(module = 0x128623e70, slot = 0x128086e90,
size = 0x1002135f0, glyph_index = 23U, load_flags = 512), line 57 in
"afmodule.c"
  [7] FT_Load_Glyph(*face = 0x1282a00c0*, glyph_index = 23U, load_flags =
512), line 612 in "ftobjs.c"
  [8] _cairo_ft_scaled_glyph_init(abstract_font = 0x1230a66a0, scaled_glyph
= 0x1243639c8, info = CAIRO_SCALED_GLYPH_INFO_METRICS), line 2159 in
"cairo-ft-font.c"
  [9] _cairo_scaled_glyph_lookup(scaled_font = 0x1230a66a0, index = 23U,
info = CAIRO_SCALED_GLYPH_INFO_METRICS, scaled_glyph_ret =
0xffffffff27edf520), line 2934 in "cairo-scaled-font.c"
  [10] cairo_scaled_font_text_to_glyphs_internal_uncached(scaled_font =
0x1230a66a0, x = 4.0, y = 0.0, utf8 = 0x124365cb0 "$  4,000", glyphs =
0x123354400, clusters = (nil), num_chars = 8), line 1755 in
"cairo-scaled-font.c"
  [11] cairo_scaled_font_text_to_glyphs(scaled_font = 0x1230a66a0, x = 0.0,
y = 0.0, utf8 = 0x124365cb0 "$  4,000", utf8_len = 8, glyphs =
0xffffffff27edf7c0, num_glyphs = 0xffffffff27edf7bc, clusters = (nil),
num_clusters = (nil), cluster_flags = (nil)), line 2076 in
"cairo-scaled-font.c"
  [12] cairo_text_extents(cr = 0x1243660c0, utf8 = 0x124365cb0 "$  4,000",
extents = 0xffffffff27edf8c0), line 3094 in "cairo.c"

The crash happens on the statement
found->last->edge_next = seg
At the time of crash found->last is null.

I found another thread executing in the same function
current thread: t@102
=>[1] af_latin_hints_compute_edges(hints = 0x128623eb0, dim =
AF_DIMENSION_HORZ), line 1153 in "aflatin.c"
  [2] af_latin_hints_detect_features(hints = 0x128623eb0, dim =
AF_DIMENSION_HORZ), line 1207 in "aflatin.c"
  [3] af_latin_hints_apply(hints = 0x128623eb0, outline = 0x100cb61b8,
metrics = 0x1165c2310), line 1951 in "aflatin.c"
  [4] af_loader_load_g(loader = 0x128623e98, scaler = 0xffffffff2b7d6568,
glyph_index = 70U, load_flags = 2561, depth = 0), line 165 in "afloader.c"
  [5] af_loader_load_glyph(loader = 0x128623e98, face = 0x129c98910, gindex
= 70U, load_flags = 2561U), line 484 in "afloader.c"
  [6] af_autofitter_load_glyph(module = 0x128623e70, slot = 0x1165c65d0,
size = 0x103312420, glyph_index = 70U, load_flags = 512), line 57 in
"afmodule.c"
  [7] FT_Load_Glyph(face = 0x129c98910, glyph_index = 70U, load_flags =
512), line 612 in "ftobjs.c"
  [8] _cairo_ft_scaled_glyph_init(abstract_font = 0x124367000, scaled_glyph
= 0x122e96a48, info = CAIRO_SCALED_GLYPH_INFO_METRICS), line 2159 in
"cairo-ft-font.c"
  [9] _cairo_scaled_glyph_lookup(scaled_font = 0x124367000, index = 70U,
info = CAIRO_SCALED_GLYPH_INFO_METRICS, scaled_glyph_ret =
0xffffffff2b7d6ad0), line 2934 in "cairo-scaled-font.c"
  [10] cairo_scaled_font_text_to_glyphs_internal_cached(scaled_font =
0x124367000, x = 10.0, y = 0.0, utf8 = 0xffffffff2b7d7d0e "Secondary
Dataset 1", glyphs = 0x124360ef0, clusters = (nil), num_chars = 19), line
1695 in "cairo-scaled-font.c"
  [11] cairo_scaled_font_text_to_glyphs(scaled_font = 0x124367000, x = 0.0,
y = 0.0, utf8 = 0xffffffff2b7d7d0e "Secondary Dataset 1", utf8_len = 19,
glyphs = 0xffffffff2b7d7470, num_glyphs = 0xffffffff2b7d746c, clusters =
(nil), num_clusters = (nil), cluster_flags = (nil)), line 2069 in
"cairo-scaled-font.c"
  [12] cairo_text_extents(cr = 0x1243610c0, utf8 = 0xffffffff2b7d7d0e
"Secondary Dataset 1", extents = 0xffffffff2b7d7570), line 3094 in "cairo.c"

The hints object comes from the freetype library which is initialized once
in _cairo_ft_unscaled_font_map_create. So all the faces use the same
freetype library. Wouldn't this lead to race conditions?

The cairo version I am using is 1.12.2 and freetype is 2.2.1

Thank you
Joseph

-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.