diff --git a/src/hb-common.cc b/src/hb-common.cc index baf597750..1301ab2b2 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -238,17 +238,12 @@ hb_language_to_string (hb_language_t language) hb_language_t hb_language_get_default (void) { - static hb_language_t default_language; + static hb_language_t default_language = HB_LANGUAGE_INVALID; - 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. */ - - 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;