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;