Make atexit callbacks threadsafe (#930)
diff --git a/src/hb-common.cc b/src/hb-common.cc
index ce3d01b..b16c932 100644
--- a/src/hb-common.cc
+++ b/src/hb-common.cc
@@ -60,12 +60,12 @@
/**
* hb_tag_from_string:
- * @str: (array length=len) (element-type uint8_t):
- * @len:
+ * @str: (array length=len) (element-type uint8_t):
+ * @len:
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -90,10 +90,10 @@
/**
* hb_tag_to_string:
- * @tag:
- * @buf: (out caller-allocates) (array fixed-size=4) (element-type uint8_t):
+ * @tag:
+ * @buf: (out caller-allocates) (array fixed-size=4) (element-type uint8_t):
*
- *
+ *
*
* Since: 0.9.5
**/
@@ -118,12 +118,12 @@
/**
* hb_direction_from_string:
- * @str: (array length=len) (element-type uint8_t):
- * @len:
+ * @str: (array length=len) (element-type uint8_t):
+ * @len:
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -146,11 +146,11 @@
/**
* hb_direction_to_string:
- * @direction:
+ * @direction:
*
- *
*
- * Return value: (transfer none):
+ *
+ * Return value: (transfer none):
*
* Since: 0.9.2
**/
@@ -361,7 +361,7 @@
/**
* hb_language_get_default:
*
- *
+ *
*
* Return value: (transfer none):
*
@@ -390,7 +390,7 @@
*
* Converts an ISO 15924 script tag to a corresponding #hb_script_t.
*
- * Return value:
+ * Return value:
* An #hb_script_t corresponding to the ISO 15924 tag.
*
* Since: 0.9.2
@@ -439,7 +439,7 @@
* corresponding #hb_script_t. Shorthand for hb_tag_from_string() then
* hb_script_from_iso15924_tag().
*
- * Return value:
+ * Return value:
* An #hb_script_t corresponding to the ISO 15924 tag.
*
* Since: 0.9.2
@@ -469,11 +469,11 @@
/**
* hb_script_get_horizontal_direction:
- * @script:
+ * @script:
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.2
**/
@@ -613,13 +613,13 @@
/**
* hb_version_atleast:
- * @major:
- * @minor:
- * @micro:
+ * @major:
+ * @minor:
+ * @micro:
*
- *
*
- * Return value:
+ *
+ * Return value:
*
* Since: 0.9.30
**/
@@ -724,8 +724,14 @@
static void
free_C_locale (void)
{
- if (C_locale)
- HB_FREE_LOCALE (C_locale);
+retry:
+ HB_LOCALE_T locale = (HB_LOCALE_T) hb_atomic_ptr_get (&C_locale);
+
+ if (!hb_atomic_ptr_cmpexch (&C_locale, locale, nullptr))
+ goto retry;
+
+ if (locale)
+ HB_FREE_LOCALE (locale);
}
#endif