[cairo-bugs] [Bug 104561] New: Unthread-safe fonts are shared between threads

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Tue Jan 9 19:14:56 UTC 2018


https://bugs.freedesktop.org/show_bug.cgi?id=104561

            Bug ID: 104561
           Summary: Unthread-safe fonts are shared between threads
           Product: cairo
           Version: unspecified
          Hardware: Other
                OS: All
            Status: NEW
          Severity: normal
          Priority: medium
         Component: general
          Assignee: chris at chris-wilson.co.uk
          Reporter: jmuizelaar at mozilla.com
        QA Contact: cairo-bugs at cairographics.org

Running pthread-show-text with the following patch shows that all threads are
sharing the same cairo_font_face_t. However cairo_font_face_t are not thread
safe.

diff --git a/test/pthread-show-text.c b/test/pthread-show-text.c
index 0f076cb61..4069fd756 100644
--- a/test/pthread-show-text.c
+++ b/test/pthread-show-text.c
@@ -67,6 +67,7 @@ draw_thread (void *arg)
                            CAIRO_FONT_SLANT_NORMAL,
                            CAIRO_FONT_WEIGHT_NORMAL);
     cairo_set_font_size (cr, NUM_ITERATIONS);
+    printf("font: %p\n", cairo_get_font_face(cr));
     cairo_font_extents (cr, &extents);

     cairo_move_to (cr, 1, HEIGHT - extents.descent - 1);


Additionally running with thread sanitizer gives:
TESTING pthread-show-text
pthread-show-text.image.rgb24 [0x1]:    font: 0x7b1400002850
font: 0x7b1400002850
font: 0x7b1400002850
font: 0x7b1400002850
font: 0x7b1400002850
font: 0x7b1400002850
font: 0x7b1400002850
font: 0x7b1400002850
==================
WARNING: ThreadSanitizer: data race (pid=356)
  Write of size 4 at 0x7b54000114b8 by thread T3 (mutexes: write M109):
    #0 _cairo_scaled_font_freeze_cache
/home/jrmuizel/src/cairo/src/cairo-scaled-font.c:796:31
(libcairo.so.2+0x12b597)
    #1 INT_cairo_scaled_font_text_to_glyphs
/home/jrmuizel/src/cairo/src/cairo-scaled-font.c:2034:5
(libcairo.so.2+0x12ea6c)
    #2 cairo_show_text /home/jrmuizel/src/cairo/src/cairo.c:3552:14
(libcairo.so.2+0x193244)
    #3 draw_thread /home/jrmuizel/src/cairo/test/pthread-show-text.c:85:2
(cairo-test-suite+0x54e428)

  Previous read of size 4 at 0x7b54000114b8 by thread T8:
    #0 INT_cairo_scaled_font_destroy
/home/jrmuizel/src/cairo/src/cairo-scaled-font.c:1326:5
(libcairo.so.2+0x129cdd)
    #1 _cairo_gstate_unset_scaled_font
/home/jrmuizel/src/cairo/src/cairo-gstate.c:1709:2 (libcairo.so.2+0x6a144)
    #2 _cairo_gstate_set_font_size
/home/jrmuizel/src/cairo/src/cairo-gstate.c:1719:5 (libcairo.so.2+0x6efa7)
    #3 _cairo_default_context_set_font_size
/home/jrmuizel/src/cairo/src/cairo-default-context.c:1224:12
(libcairo.so.2+0x5ce8f)
    #4 INT_cairo_set_font_size /home/jrmuizel/src/cairo/src/cairo.c:3164:14
(libcairo.so.2+0x1922c0)
    #5 draw_thread /home/jrmuizel/src/cairo/test/pthread-show-text.c:81:2
(cairo-test-suite+0x54e3aa)

  Location is heap block of size 536 at 0x7b5400011300 allocated by thread T1:
    #0 malloc <null> (cairo-test-suite+0x431d7b)
    #1 _cairo_ft_font_face_scaled_font_create
/home/jrmuizel/src/cairo/src/cairo-ft-font.c:2016:19 (libcairo.so.2+0x24b48f)
    #2 INT_cairo_scaled_font_create
/home/jrmuizel/src/cairo/src/cairo-scaled-font.c:1144:14
(libcairo.so.2+0x12d19b)
    #3 _cairo_gstate_ensure_scaled_font
/home/jrmuizel/src/cairo/src/cairo-gstate.c:1915:19 (libcairo.so.2+0x6f5ca)
    #4 _cairo_gstate_get_scaled_font
/home/jrmuizel/src/cairo/src/cairo-gstate.c:1787:14 (libcairo.so.2+0x6f3c4)
    #5 _cairo_default_context_get_scaled_font
/home/jrmuizel/src/cairo/src/cairo-default-context.c:1300:14
(libcairo.so.2+0x5d31f)
    #6 INT_cairo_get_scaled_font /home/jrmuizel/src/cairo/src/cairo.c:3348:12
(libcairo.so.2+0x192823)
    #7 cairo_show_text /home/jrmuizel/src/cairo/src/cairo.c:3529:19
(libcairo.so.2+0x193003)
    #8 draw_thread /home/jrmuizel/src/cairo/test/pthread-show-text.c:85:2
(cairo-test-suite+0x54e428)

  Mutex M109 (0x7b5400011478) created at:
    #0 pthread_mutex_lock <null> (cairo-test-suite+0x438fa5)
    #1 _cairo_scaled_font_freeze_cache
/home/jrmuizel/src/cairo/src/cairo-scaled-font.c:795:5 (libcairo.so.2+0x12b57a)
    #2 INT_cairo_scaled_font_text_to_glyphs
/home/jrmuizel/src/cairo/src/cairo-scaled-font.c:2034:5
(libcairo.so.2+0x12ea6c)
    #3 cairo_show_text /home/jrmuizel/src/cairo/src/cairo.c:3552:14
(libcairo.so.2+0x193244)
    #4 draw_thread /home/jrmuizel/src/cairo/test/pthread-show-text.c:85:2
(cairo-test-suite+0x54e428)

  Thread T3 (tid=361, running) created by main thread at:
    #0 pthread_create <null> (cairo-test-suite+0x4326f6)
    #1 draw /home/jrmuizel/src/cairo/test/pthread-show-text.c:107:13
(cairo-test-suite+0x54e06a)
    #2 cairo_test_for_target /home/jrmuizel/src/cairo/test/cairo-test.c:933:14
(cairo-test-suite+0x4c6dd4)
    #3 _cairo_test_context_run_for_target
/home/jrmuizel/src/cairo/test/cairo-test.c:1536:15 (cairo-test-suite+0x4c45c0)
    #4 _cairo_test_runner_draw
/home/jrmuizel/src/cairo/test/cairo-test-runner.c:247:12
(cairo-test-suite+0x4cceb4)
    #5 main /home/jrmuizel/src/cairo/test/cairo-test-runner.c:937:13
(cairo-test-suite+0x4ca5e8)

  Thread T8 (tid=366, running) created by main thread at:
    #0 pthread_create <null> (cairo-test-suite+0x4326f6)
    #1 draw /home/jrmuizel/src/cairo/test/pthread-show-text.c:107:13
(cairo-test-suite+0x54e06a)
    #2 cairo_test_for_target /home/jrmuizel/src/cairo/test/cairo-test.c:933:14
(cairo-test-suite+0x4c6dd4)
    #3 _cairo_test_context_run_for_target
/home/jrmuizel/src/cairo/test/cairo-test.c:1536:15 (cairo-test-suite+0x4c45c0)
    #4 _cairo_test_runner_draw
/home/jrmuizel/src/cairo/test/cairo-test-runner.c:247:12
(cairo-test-suite+0x4cceb4)
    #5 main /home/jrmuizel/src/cairo/test/cairo-test-runner.c:937:13
(cairo-test-suite+0x4ca5e8)

  Thread T1 (tid=358, running) created by main thread at:
    #0 pthread_create <null> (cairo-test-suite+0x4326f6)
    #1 draw /home/jrmuizel/src/cairo/test/pthread-show-text.c:107:13
(cairo-test-suite+0x54e06a)
    #2 cairo_test_for_target /home/jrmuizel/src/cairo/test/cairo-test.c:933:14
(cairo-test-suite+0x4c6dd4)
    #3 _cairo_test_context_run_for_target
/home/jrmuizel/src/cairo/test/cairo-test.c:1536:15 (cairo-test-suite+0x4c45c0)
    #4 _cairo_test_runner_draw
/home/jrmuizel/src/cairo/test/cairo-test-runner.c:247:12
(cairo-test-suite+0x4cceb4)
    #5 main /home/jrmuizel/src/cairo/test/cairo-test-runner.c:937:13
(cairo-test-suite+0x4ca5e8)

SUMMARY: ThreadSanitizer: data race
/home/jrmuizel/src/cairo/src/cairo-scaled-font.c:796:31 in
_cairo_scaled_font_freeze_cache
==================
pthread-show-text.image.rgb24 [0x1]:    FAIL
ThreadSanitizer: reported 1 warnings
pthread-show-text: UNTESTED

-- 
You are receiving this mail because:
You are the QA Contact for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.cairographics.org/archives/cairo-bugs/attachments/20180109/6c03e475/attachment.html>


More information about the cairo-bugs mailing list