Index: third_party/harfbuzz-ng/src/hb-common.cc |
diff --git a/third_party/harfbuzz-ng/src/hb-common.cc b/third_party/harfbuzz-ng/src/hb-common.cc |
index 331d255b45f38e12cdf839c6ee6a062bc317594f..33a514dbfda8758283208a9e264a8cee98c64137 100644 |
--- a/third_party/harfbuzz-ng/src/hb-common.cc |
+++ b/third_party/harfbuzz-ng/src/hb-common.cc |
@@ -58,6 +58,15 @@ hb_tag_from_string (const char *s, int len) |
return HB_TAG_CHAR4 (tag); |
} |
+void |
+hb_tag_to_string (hb_tag_t tag, char *buf) |
+{ |
+ buf[0] = (char) (uint8_t) (tag >> 24); |
+ buf[1] = (char) (uint8_t) (tag >> 16); |
+ buf[2] = (char) (uint8_t) (tag >> 8); |
+ buf[3] = (char) (uint8_t) (tag >> 0); |
+} |
+ |
/* hb_direction_t */ |
@@ -98,7 +107,7 @@ hb_direction_to_string (hb_direction_t direction) |
/* hb_language_t */ |
-struct _hb_language_t { |
+struct hb_language_impl_t { |
const char s[1]; |
}; |
@@ -238,17 +247,12 @@ hb_language_to_string (hb_language_t language) |
hb_language_t |
hb_language_get_default (void) |
{ |
- static hb_language_t default_language; |
- |
- if (!default_language) { |
- /* This block is not quite threadsafe, but is not as bad as |
- * it looks since it's idempotent. As long as pointer ops |
- * are atomic, we are safe. */ |
- |
- /* I hear that setlocale() doesn't honor env vars on Windows, |
- * but for now we ignore that. */ |
+ static hb_language_t default_language = HB_LANGUAGE_INVALID; |
- default_language = hb_language_from_string (setlocale (LC_CTYPE, NULL), -1); |
+ hb_language_t language = (hb_language_t) hb_atomic_ptr_get (&default_language); |
+ if (unlikely (language == HB_LANGUAGE_INVALID)) { |
+ language = hb_language_from_string (setlocale (LC_CTYPE, NULL), -1); |
+ hb_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, language); |
} |
return default_language; |