7e56dce9ef
This release supports old-style kern table in the code path we are using in CommonLayout. Change-Id: Id20e6fe1cfe98ef65b8fa4a5627f6246cbac54a6 Reviewed-on: https://gerrit.libreoffice.org/44693 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Khaled Hosny <khaledhosny@eglug.org>
200 lines
6.5 KiB
Diff
200 lines
6.5 KiB
Diff
From 93f7c1652a05e806c2e3ac7edf498d2f4a508a3a Mon Sep 17 00:00:00 2001
|
|
From: Behdad Esfahbod <behdad@behdad.org>
|
|
Date: Tue, 14 Nov 2017 10:59:54 -0800
|
|
Subject: [PATCH] Revert "[glib/ucdn/icu/ft/ot] Make returned funcs inert"
|
|
|
|
This reverts commit 5daf3bd4494cce6b4fb074533be9e99c4d9e0edd.
|
|
|
|
If other atexit callbacks try to destruct the objects we destruct
|
|
in atexit callbacks, bad things will happen.
|
|
|
|
I'll come up with some other way to catch premature destruction
|
|
of HB-owned objects.
|
|
|
|
Fixes https://github.com/behdad/harfbuzz/issues/618
|
|
---
|
|
src/hb-ft.cc | 3 ---
|
|
src/hb-glib.cc | 3 ---
|
|
src/hb-icu.cc | 3 ---
|
|
src/hb-object-private.hh | 37 ++++++-------------------------------
|
|
src/hb-ot-font.cc | 3 ---
|
|
src/hb-ucdn.cc | 3 ---
|
|
6 files changed, 6 insertions(+), 46 deletions(-)
|
|
|
|
diff --git src/hb-ft.cc src/hb-ft.cc
|
|
index 68c774547..0f15f8c3d 100644
|
|
--- src/hb-ft.cc
|
|
+++ src/hb-ft.cc
|
|
@@ -423,7 +423,6 @@ static hb_font_funcs_t *static_ft_funcs = nullptr;
|
|
static
|
|
void free_static_ft_funcs (void)
|
|
{
|
|
- hb_object_undo_inert (static_ft_funcs);
|
|
hb_font_funcs_destroy (static_ft_funcs);
|
|
}
|
|
#endif
|
|
@@ -454,10 +453,8 @@ _hb_ft_font_set_funcs (hb_font_t *font, FT_Face ft_face, bool unref)
|
|
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;
|
|
}
|
|
diff --git src/hb-glib.cc src/hb-glib.cc
|
|
index 31de68e86..50c30e9c7 100644
|
|
--- src/hb-glib.cc
|
|
+++ src/hb-glib.cc
|
|
@@ -370,7 +370,6 @@ static hb_unicode_funcs_t *static_glib_funcs = nullptr;
|
|
static
|
|
void free_static_glib_funcs (void)
|
|
{
|
|
- hb_object_undo_inert (static_glib_funcs);
|
|
hb_unicode_funcs_destroy (static_glib_funcs);
|
|
}
|
|
#endif
|
|
@@ -391,10 +390,8 @@ hb_glib_get_unicode_funcs (void)
|
|
#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;
|
|
}
|
|
diff --git src/hb-icu.cc src/hb-icu.cc
|
|
index 44a198937..552eaeca5 100644
|
|
--- src/hb-icu.cc
|
|
+++ src/hb-icu.cc
|
|
@@ -351,7 +351,6 @@ static hb_unicode_funcs_t *static_icu_funcs = nullptr;
|
|
static
|
|
void free_static_icu_funcs (void)
|
|
{
|
|
- hb_object_undo_inert (static_icu_funcs);
|
|
hb_unicode_funcs_destroy (static_icu_funcs);
|
|
}
|
|
#endif
|
|
@@ -380,10 +379,8 @@ hb_icu_get_unicode_funcs (void)
|
|
#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;
|
|
}
|
|
diff --git src/hb-object-private.hh src/hb-object-private.hh
|
|
index 0dada492c..baa1f8f05 100644
|
|
--- src/hb-object-private.hh
|
|
+++ src/hb-object-private.hh
|
|
@@ -41,10 +41,9 @@
|
|
|
|
/* 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
|
|
{
|
|
@@ -54,23 +53,9 @@ 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; }
|
|
};
|
|
|
|
@@ -161,16 +146,6 @@ static inline bool hb_object_is_valid (const Type *obj)
|
|
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);
|
|
diff --git src/hb-ot-font.cc src/hb-ot-font.cc
|
|
index 72d3c5836..47416012c 100644
|
|
--- src/hb-ot-font.cc
|
|
+++ src/hb-ot-font.cc
|
|
@@ -663,7 +663,6 @@ static hb_font_funcs_t *static_ot_funcs = nullptr;
|
|
static
|
|
void free_static_ot_funcs (void)
|
|
{
|
|
- hb_object_undo_inert (static_ot_funcs);
|
|
hb_font_funcs_destroy (static_ot_funcs);
|
|
}
|
|
#endif
|
|
@@ -694,10 +693,8 @@ _hb_ot_get_font_funcs (void)
|
|
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;
|
|
}
|
|
diff --git src/hb-ucdn.cc src/hb-ucdn.cc
|
|
index 99266724f..9515bda25 100644
|
|
--- src/hb-ucdn.cc
|
|
+++ src/hb-ucdn.cc
|
|
@@ -237,7 +237,6 @@ static hb_unicode_funcs_t *static_ucdn_funcs = nullptr;
|
|
static
|
|
void free_static_ucdn_funcs (void)
|
|
{
|
|
- hb_object_undo_inert (static_ucdn_funcs);
|
|
hb_unicode_funcs_destroy (static_ucdn_funcs);
|
|
}
|
|
#endif
|
|
@@ -259,10 +258,8 @@ hb_ucdn_get_unicode_funcs (void)
|
|
#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;
|
|
}
|