static
void free_static_ft_funcs (void)
{
- hb_object_undo_inert (static_ft_funcs);
hb_font_funcs_destroy (static_ft_funcs);
}
#endif
hb_font_funcs_set_glyph_from_name_func (funcs, hb_ft_get_glyph_from_name, nullptr, nullptr);
hb_font_funcs_make_immutable (funcs);
- hb_object_make_inert (funcs);
if (!hb_atomic_ptr_cmpexch (&static_ft_funcs, nullptr, funcs)) {
- hb_object_undo_inert (funcs);
hb_font_funcs_destroy (funcs);
goto retry;
}
static
void free_static_glib_funcs (void)
{
- hb_object_undo_inert (static_glib_funcs);
hb_unicode_funcs_destroy (static_glib_funcs);
}
#endif
#undef HB_UNICODE_FUNC_IMPLEMENT
hb_unicode_funcs_make_immutable (funcs);
- hb_object_make_inert (funcs);
if (!hb_atomic_ptr_cmpexch (&static_glib_funcs, nullptr, funcs)) {
- hb_object_undo_inert (funcs);
hb_unicode_funcs_destroy (funcs);
goto retry;
}
static
void free_static_icu_funcs (void)
{
- hb_object_undo_inert (static_icu_funcs);
hb_unicode_funcs_destroy (static_icu_funcs);
}
#endif
#undef HB_UNICODE_FUNC_IMPLEMENT
hb_unicode_funcs_make_immutable (funcs);
- hb_object_make_inert (funcs);
if (!hb_atomic_ptr_cmpexch (&static_icu_funcs, nullptr, funcs)) {
- hb_object_undo_inert (funcs);
hb_unicode_funcs_destroy (funcs);
goto retry;
}
/* reference_count */
-#define HB_REFERENCE_COUNT_UNCHANGABLE_VALUE -0x53043
-#define HB_REFERENCE_COUNT_UNREFFABLE_VALUE -0x07734
-#define HB_REFERENCE_COUNT_UNTOUCHABLE_VALUE -0xBEDAD
-#define HB_REFERENCE_COUNT_INIT {HB_ATOMIC_INT_INIT (HB_REFERENCE_COUNT_UNCHANGABLE_VALUE)}
+#define HB_REFERENCE_COUNT_INERT_VALUE -1
+#define HB_REFERENCE_COUNT_POISON_VALUE -0x0000DEAD
+#define HB_REFERENCE_COUNT_INIT {HB_ATOMIC_INT_INIT(HB_REFERENCE_COUNT_INERT_VALUE)}
struct hb_reference_count_t
{
inline int get_unsafe (void) const { return ref_count.get_unsafe (); }
inline int inc (void) { return ref_count.inc (); }
inline int dec (void) { return ref_count.dec (); }
- inline void finish (void) { ref_count.set_unsafe (HB_REFERENCE_COUNT_UNTOUCHABLE_VALUE); }
-
- inline void make_inert (void)
- {
- if (get_unsafe () == HB_REFERENCE_COUNT_UNCHANGABLE_VALUE)
- return;
- ref_count.set_unsafe (HB_REFERENCE_COUNT_UNREFFABLE_VALUE);
- }
- inline void undo_inert (void)
- {
- if (get_unsafe () == HB_REFERENCE_COUNT_UNCHANGABLE_VALUE)
- return;
- assert (get_unsafe () == HB_REFERENCE_COUNT_UNREFFABLE_VALUE);
- ref_count.set_unsafe (1);
- }
-
- inline bool is_inert (void) const { return ref_count.get_unsafe () < 0; }
+ inline void finish (void) { ref_count.set_unsafe (HB_REFERENCE_COUNT_POISON_VALUE); }
+
+ inline bool is_inert (void) const { return ref_count.get_unsafe () == HB_REFERENCE_COUNT_INERT_VALUE; }
inline bool is_valid (void) const { return ref_count.get_unsafe () > 0; }
};
return likely (obj->header.ref_count.is_valid ());
}
template <typename Type>
-static inline void hb_object_make_inert (Type *obj)
-{
- obj->header.ref_count.make_inert ();
-}
-template <typename Type>
-static inline void hb_object_undo_inert (Type *obj)
-{
- obj->header.ref_count.undo_inert ();
-}
-template <typename Type>
static inline Type *hb_object_reference (Type *obj)
{
hb_object_trace (obj, HB_FUNC);
static
void free_static_ot_funcs (void)
{
- hb_object_undo_inert (static_ot_funcs);
hb_font_funcs_destroy (static_ot_funcs);
}
#endif
hb_font_funcs_set_glyph_from_name_func (funcs, hb_ot_get_glyph_from_name, nullptr, nullptr);
hb_font_funcs_make_immutable (funcs);
- hb_object_make_inert (funcs);
if (!hb_atomic_ptr_cmpexch (&static_ot_funcs, nullptr, funcs)) {
- hb_object_undo_inert (funcs);
hb_font_funcs_destroy (funcs);
goto retry;
}
static
void free_static_ucdn_funcs (void)
{
- hb_object_undo_inert (static_ucdn_funcs);
hb_unicode_funcs_destroy (static_ucdn_funcs);
}
#endif
#undef HB_UNICODE_FUNC_IMPLEMENT
hb_unicode_funcs_make_immutable (funcs);
- hb_object_make_inert (funcs);
if (!hb_atomic_ptr_cmpexch (&static_ucdn_funcs, nullptr, funcs)) {
- hb_object_undo_inert (funcs);
hb_unicode_funcs_destroy (funcs);
goto retry;
}