[HarfBuzz] harfbuzz: Branch 'master' - 3 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Wed Sep 26 19:03:50 UTC 2018


 src/hb-blob.cc              |    2 
 src/hb-face.cc              |    2 
 src/hb-font.cc              |    4 +
 src/hb-unicode.cc           |    2 
 test/api/Makefile.am        |    6 +
 test/api/test-multithread.c |  142 ++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 158 insertions(+)

New commits:
commit 90a0f9fa0c020c268ac3ba31c7f1337eed85f35e
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed Sep 26 15:03:07 2018 -0400

    Make TSan happy with make_immutable()

diff --git a/src/hb-blob.cc b/src/hb-blob.cc
index fca3c910..f0952665 100644
--- a/src/hb-blob.cc
+++ b/src/hb-blob.cc
@@ -293,6 +293,8 @@ hb_blob_make_immutable (hb_blob_t *blob)
 {
   if (hb_object_is_inert (blob))
     return;
+  if (blob->immutable)
+    return;
 
   blob->immutable = true;
 }
diff --git a/src/hb-face.cc b/src/hb-face.cc
index 19eea4d3..fbab18aa 100644
--- a/src/hb-face.cc
+++ b/src/hb-face.cc
@@ -325,6 +325,8 @@ hb_face_make_immutable (hb_face_t *face)
 {
   if (unlikely (hb_object_is_inert (face)))
     return;
+  if (face->immutable)
+    return;
 
   face->immutable = true;
 }
diff --git a/src/hb-font.cc b/src/hb-font.cc
index 9dcf6c12..77762f2d 100644
--- a/src/hb-font.cc
+++ b/src/hb-font.cc
@@ -586,6 +586,8 @@ hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs)
 {
   if (unlikely (hb_object_is_inert (ffuncs)))
     return;
+  if (ffuncs->immutable)
+    return;
 
   ffuncs->immutable = true;
 }
@@ -1444,6 +1446,8 @@ hb_font_make_immutable (hb_font_t *font)
 {
   if (unlikely (hb_object_is_inert (font)))
     return;
+  if (font->immutable)
+    return;
 
   if (font->parent)
     hb_font_make_immutable (font->parent);
diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc
index bb1cd682..0e8b520d 100644
--- a/src/hb-unicode.cc
+++ b/src/hb-unicode.cc
@@ -308,6 +308,8 @@ hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs)
 {
   if (unlikely (hb_object_is_inert (ufuncs)))
     return;
+  if (ufuncs->immutable)
+    return;
 
   ufuncs->immutable = true;
 }
commit 34d5a2595331c568ae524057d031c9d5d2573978
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed Sep 26 15:02:21 2018 -0400

    Fix test-multithread and increase num_threads to 30
    
    What were you thinking? ;)

diff --git a/test/api/test-multithread.c b/test/api/test-multithread.c
index 3a0d8845..b9bcdf86 100644
--- a/test/api/test-multithread.c
+++ b/test/api/test-multithread.c
@@ -78,7 +78,7 @@ int
 main (int argc, char **argv)
 {
   int i;
-  int num_threads = 1; // FIXME: Increase this and fix the issue
+  int num_threads = 30; // FIXME: Increase this and fix the issue
   pthread_t *threads = calloc (num_threads, sizeof (pthread_t));
   hb_buffer_t **buffers = calloc (num_threads, sizeof (hb_buffer_t *));
 
@@ -99,42 +99,38 @@ main (int argc, char **argv)
   /* Let them loose! */
   pthread_mutex_unlock (&mutex);
 
+  hb_buffer_t *ref_buffer = hb_buffer_create ();
+  fill_the_buffer (ref_buffer);
+
   for (i = 0; i < num_threads; i++)
   {
     pthread_join (threads[i], NULL);
-
-    hb_buffer_t *ref_buffer = hb_buffer_create ();
-    fill_the_buffer (ref_buffer);
-
-    for (i = 0; i < num_threads; i++)
+    hb_buffer_t *buffer = buffers[i];
+    hb_buffer_diff_flags_t diff = hb_buffer_diff (ref_buffer, buffer, (hb_codepoint_t) -1, 0);
+    if (diff)
     {
-      hb_buffer_t *buffer = buffers[i];
-      hb_buffer_diff_flags_t diff = hb_buffer_diff (ref_buffer, buffer, (hb_codepoint_t) -1, 0);
-      if (diff)
-      {
-	fprintf (stderr, "One of the buffers (%d) was different from the reference.\n", i);
-	char out[255];
-
-	hb_buffer_serialize_glyphs (buffer, 0, hb_buffer_get_length (ref_buffer),
-				    out, sizeof (out), NULL,
-				    font, HB_BUFFER_SERIALIZE_FORMAT_TEXT,
-				    HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
-	fprintf (stderr, "Actual: %s\n", out);
-
-	hb_buffer_serialize_glyphs (ref_buffer, 0, hb_buffer_get_length (ref_buffer),
-				    out, sizeof (out), NULL,
-				    font, HB_BUFFER_SERIALIZE_FORMAT_TEXT,
-				    HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
-	fprintf (stderr, "Expected: %s\n", out);
-
-	return 1;
-      }
-      hb_buffer_destroy (buffer);
+      fprintf (stderr, "One of the buffers (%d) was different from the reference.\n", i);
+      char out[255];
+
+      hb_buffer_serialize_glyphs (buffer, 0, hb_buffer_get_length (ref_buffer),
+				  out, sizeof (out), NULL,
+				  font, HB_BUFFER_SERIALIZE_FORMAT_TEXT,
+				  HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
+      fprintf (stderr, "Actual: %s\n", out);
+
+      hb_buffer_serialize_glyphs (ref_buffer, 0, hb_buffer_get_length (ref_buffer),
+				  out, sizeof (out), NULL,
+				  font, HB_BUFFER_SERIALIZE_FORMAT_TEXT,
+				  HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
+      fprintf (stderr, "Expected: %s\n", out);
+
+      return 1;
     }
-
-    hb_buffer_destroy (ref_buffer);
+    hb_buffer_destroy (buffer);
   }
 
+  hb_buffer_destroy (ref_buffer);
+
   free (buffers);
   free (threads);
 
commit 8bb73dad7f3279e1f1362cf9a137504e8ef08985
Author: Ebrahim Byagowi <ebrahim at gnu.org>
Date:   Wed Sep 26 20:50:51 2018 +0330

    Add a multithreaded test (#1184)

diff --git a/test/api/Makefile.am b/test/api/Makefile.am
index d92e9669..1c0f92c1 100644
--- a/test/api/Makefile.am
+++ b/test/api/Makefile.am
@@ -76,6 +76,12 @@ TEST_PROGS += \
 	test-ot-tag \
 	$(NULL)
 
+if HAVE_PTHREAD
+TEST_PROGS += test-multithread
+test_multithread_CFLAGS = $(CFLAGS) $(PTHREAD_CFLAGS)
+test_multithread_LDADD = $(LDADD) $(PTHREAD_LIBS)
+endif
+
 if HAVE_FREETYPE
 TEST_PROGS += \
 	test-ot-math \
diff --git a/test/api/test-multithread.c b/test/api/test-multithread.c
new file mode 100644
index 00000000..3a0d8845
--- /dev/null
+++ b/test/api/test-multithread.c
@@ -0,0 +1,146 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <pthread.h>
+
+#include <hb.h>
+#include <hb-ot.h>
+
+const char *text = "طرح‌نَما";
+const char *path =
+#if defined(__linux__)
+		"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf";
+#elif defined(_WIN32) || defined(_WIN64)
+		"C:\\Windows\\Fonts\\tahoma.ttf";
+#elif __APPLE__
+		"/Library/Fonts/Tahoma.ttf";
+#endif
+
+int num_iters = 200;
+
+hb_font_t *font;
+
+pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static void
+fill_the_buffer(hb_buffer_t *buffer)
+{
+  hb_buffer_add_utf8 (buffer, text, sizeof (text), 0, sizeof (text));
+  hb_buffer_guess_segment_properties (buffer);
+  hb_shape (font, buffer, NULL, 0);
+}
+
+static void *
+thread_func (void *data)
+{
+  hb_buffer_t *buffer = (hb_buffer_t *) data;
+
+  pthread_mutex_lock (&mutex);
+  pthread_mutex_unlock (&mutex);
+
+  int i;
+  for (i = 0; i < num_iters; i++)
+  {
+    hb_buffer_clear_contents (buffer);
+    fill_the_buffer (buffer);
+  }
+
+  return 0;
+}
+
+int
+main (int argc, char **argv)
+{
+  int i;
+  int num_threads = 1; // FIXME: Increase this and fix the issue
+  pthread_t *threads = calloc (num_threads, sizeof (pthread_t));
+  hb_buffer_t **buffers = calloc (num_threads, sizeof (hb_buffer_t *));
+
+  pthread_mutex_lock (&mutex);
+
+  hb_blob_t *blob = hb_blob_create_from_file (path);
+  hb_face_t *face = hb_face_create (blob, 0);
+  font = hb_font_create (face);
+  hb_ot_font_set_funcs (font);
+
+  for (i = 0; i < num_threads; i++)
+  {
+    hb_buffer_t *buffer = hb_buffer_create ();
+    buffers[i] = buffer;
+    pthread_create (&threads[i], NULL, thread_func, buffer);
+  }
+
+  /* Let them loose! */
+  pthread_mutex_unlock (&mutex);
+
+  for (i = 0; i < num_threads; i++)
+  {
+    pthread_join (threads[i], NULL);
+
+    hb_buffer_t *ref_buffer = hb_buffer_create ();
+    fill_the_buffer (ref_buffer);
+
+    for (i = 0; i < num_threads; i++)
+    {
+      hb_buffer_t *buffer = buffers[i];
+      hb_buffer_diff_flags_t diff = hb_buffer_diff (ref_buffer, buffer, (hb_codepoint_t) -1, 0);
+      if (diff)
+      {
+	fprintf (stderr, "One of the buffers (%d) was different from the reference.\n", i);
+	char out[255];
+
+	hb_buffer_serialize_glyphs (buffer, 0, hb_buffer_get_length (ref_buffer),
+				    out, sizeof (out), NULL,
+				    font, HB_BUFFER_SERIALIZE_FORMAT_TEXT,
+				    HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
+	fprintf (stderr, "Actual: %s\n", out);
+
+	hb_buffer_serialize_glyphs (ref_buffer, 0, hb_buffer_get_length (ref_buffer),
+				    out, sizeof (out), NULL,
+				    font, HB_BUFFER_SERIALIZE_FORMAT_TEXT,
+				    HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
+	fprintf (stderr, "Expected: %s\n", out);
+
+	return 1;
+      }
+      hb_buffer_destroy (buffer);
+    }
+
+    hb_buffer_destroy (ref_buffer);
+  }
+
+  free (buffers);
+  free (threads);
+
+  hb_font_destroy (font);
+  hb_face_destroy (face);
+  hb_blob_destroy (blob);
+
+  return 0;
+}


More information about the HarfBuzz mailing list