[lazy] Use for ft_library

This commit is contained in:
Behdad Esfahbod 2018-08-12 16:20:11 -07:00
parent 7a8d480378
commit 53442be1ed
6 changed files with 35 additions and 36 deletions

View File

@ -461,7 +461,7 @@ void free_static_ft_funcs (void)
static hb_font_funcs_t * static hb_font_funcs_t *
_hb_ft_get_font_funcs (void) _hb_ft_get_font_funcs (void)
{ {
return const_cast<hb_font_funcs_t *> (static_ft_funcs.get ()); return static_ft_funcs.get_unconst ();
} }
static void static void
@ -683,47 +683,46 @@ hb_ft_font_create_referenced (FT_Face ft_face)
} }
/* Thread-safe, lock-free, FT_Library */ static void free_static_ft_library (void);
static hb_atomic_ptr_t<FT_Library> ft_library; static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_ft_library_lazy_loader_t,
void, 0,
hb_remove_ptr_t<FT_Library>::value>
{
static inline FT_Library create (void)
{
FT_Library l;
if (FT_Init_FreeType (&l))
return nullptr;
#ifdef HB_USE_ATEXIT
atexit (free_static_ft_library);
#endif
return l;
}
static inline void destroy (FT_Library l)
{
FT_Done_FreeType (l);
}
static inline const FT_Library get_null (void)
{
return nullptr;
}
} static_ft_library;
#ifdef HB_USE_ATEXIT #ifdef HB_USE_ATEXIT
static static
void free_ft_library (void) void free_static_ft_library (void)
{ {
retry: static_ft_library.free ();
FT_Library library = ft_library.get ();
if (unlikely (!ft_library.cmpexch (library, nullptr)))
goto retry;
FT_Done_FreeType (library);
} }
#endif #endif
static FT_Library static FT_Library
get_ft_library (void) get_ft_library (void)
{ {
retry: return static_ft_library.get_unconst ();
FT_Library library = ft_library.get ();
if (unlikely (!library))
{
/* Not found; allocate one. */
if (FT_Init_FreeType (&library))
return nullptr;
if (unlikely (!ft_library.cmpexch (nullptr, library)))
{
FT_Done_FreeType (library);
goto retry;
}
#ifdef HB_USE_ATEXIT
atexit (free_ft_library); /* First person registers atexit() callback. */
#endif
}
return library;
} }
static void static void

View File

@ -401,7 +401,7 @@ void free_static_glib_funcs (void)
hb_unicode_funcs_t * hb_unicode_funcs_t *
hb_glib_get_unicode_funcs (void) hb_glib_get_unicode_funcs (void)
{ {
return hb_unicode_funcs_reference (const_cast<hb_unicode_funcs_t *> (static_glib_funcs.get ())); return hb_unicode_funcs_reference (static_glib_funcs.get_unconst ());
} }

View File

@ -380,5 +380,5 @@ void free_static_icu_funcs (void)
hb_unicode_funcs_t * hb_unicode_funcs_t *
hb_icu_get_unicode_funcs (void) hb_icu_get_unicode_funcs (void)
{ {
return hb_unicode_funcs_reference (const_cast<hb_unicode_funcs_t *> (static_icu_funcs.get ())); return hb_unicode_funcs_reference (static_icu_funcs.get_unconst ());
} }

View File

@ -667,7 +667,6 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData>
if (unlikely (!p)) if (unlikely (!p))
{ {
p = do_create (); p = do_create ();
assert (p);
if (unlikely (!this->instance.cmpexch (nullptr, p))) if (unlikely (!this->instance.cmpexch (nullptr, p)))
{ {
do_destroy (p); do_destroy (p);
@ -689,6 +688,7 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData>
} }
inline const Returned * get (void) const { return Subclass::convert (get_stored ()); } inline const Returned * get (void) const { return Subclass::convert (get_stored ()); }
inline Returned * get_unconst (void) const { return const_cast<Returned *> (Subclass::convert (get_stored ())); }
/* To be possibly overloaded by subclasses. */ /* To be possibly overloaded by subclasses. */
static inline const Returned* convert (const Stored *p) { return p; } static inline const Returned* convert (const Stored *p) { return p; }

View File

@ -271,7 +271,7 @@ void free_static_ot_funcs (void)
static hb_font_funcs_t * static hb_font_funcs_t *
_hb_ot_get_font_funcs (void) _hb_ot_get_font_funcs (void)
{ {
return const_cast<hb_font_funcs_t *> (static_ot_funcs.get ()); return static_ot_funcs.get_unconst ();
} }

View File

@ -275,5 +275,5 @@ extern "C" HB_INTERNAL
hb_unicode_funcs_t * hb_unicode_funcs_t *
hb_ucdn_get_unicode_funcs (void) hb_ucdn_get_unicode_funcs (void)
{ {
return hb_unicode_funcs_reference (const_cast<hb_unicode_funcs_t *> (static_ucdn_funcs.get ())); return hb_unicode_funcs_reference (static_ucdn_funcs.get_unconst ());
} }