diff options
author | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2018-08-14 23:58:28 +0000 |
---|---|---|
committer | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2018-08-14 23:58:28 +0000 |
commit | 6af38938c1752bf61b8855db1f1524d0e9ed6097 (patch) | |
tree | 06d78158db2546416bbfd6f990f7f5c1264d3fa1 /Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc | |
parent | a54d196b0fc4715e3d2dbcfe62cfccea6aae57fe (diff) |
harfbuzz 1.8.8
git-svn-id: svn://tug.org/texlive/trunk@48403 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc')
-rw-r--r-- | Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc | 49 |
1 files changed, 23 insertions, 26 deletions
diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc index 246380a7350..809b22f6b46 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc @@ -31,6 +31,7 @@ #include "hb-glib.h" #include "hb-unicode-private.hh" +#include "hb-machinery-private.hh" #if !GLIB_CHECK_VERSION(2,29,14) @@ -364,30 +365,15 @@ hb_glib_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs HB_UNUSED, return utf8_decomposed_len; } -static hb_unicode_funcs_t *static_glib_funcs = nullptr; -#ifdef HB_USE_ATEXIT -static -void free_static_glib_funcs (void) -{ -retry: - hb_unicode_funcs_t *glib_funcs = (hb_unicode_funcs_t *) hb_atomic_ptr_get (&static_glib_funcs); - if (!hb_atomic_ptr_cmpexch (&static_glib_funcs, glib_funcs, nullptr)) - goto retry; - hb_unicode_funcs_destroy (glib_funcs); -} -#endif +static void free_static_glib_funcs (void); -hb_unicode_funcs_t * -hb_glib_get_unicode_funcs (void) +static struct hb_glib_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t<hb_glib_unicode_funcs_lazy_loader_t> { -retry: - hb_unicode_funcs_t *funcs = (hb_unicode_funcs_t *) hb_atomic_ptr_get (&static_glib_funcs); - - if (unlikely (!funcs)) + static inline hb_unicode_funcs_t *create (void) { - funcs = hb_unicode_funcs_create (nullptr); + hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr); #define HB_UNICODE_FUNC_IMPLEMENT(name) \ hb_unicode_funcs_set_##name##_func (funcs, hb_glib_unicode_##name, nullptr, nullptr); @@ -396,19 +382,30 @@ retry: hb_unicode_funcs_make_immutable (funcs); - if (!hb_atomic_ptr_cmpexch (&static_glib_funcs, nullptr, funcs)) { - hb_unicode_funcs_destroy (funcs); - goto retry; - } +#ifdef HB_USE_ATEXIT + atexit (free_static_glib_funcs); +#endif + + return funcs; + } +} static_glib_funcs; #ifdef HB_USE_ATEXIT - atexit (free_static_glib_funcs); /* First person registers atexit() callback. */ +static +void free_static_glib_funcs (void) +{ + static_glib_funcs.free_instance (); +} #endif - }; - return hb_unicode_funcs_reference (funcs); +hb_unicode_funcs_t * +hb_glib_get_unicode_funcs (void) +{ + return static_glib_funcs.get_unconst (); } + + #if GLIB_CHECK_VERSION(2,31,10) static void |