[HarfBuzz] harfbuzz: Branch 'master'

Behdad Esfahbod behdad at kemper.freedesktop.org
Wed Aug 6 10:36:06 PDT 2014


 src/hb-common.cc    |    4 ++--
 src/hb-ft.cc        |    2 +-
 src/hb-private.hh   |   25 +++++++++++++++++++++++++
 src/hb-shape.cc     |    2 +-
 src/hb-shaper.cc    |    2 +-
 src/hb-uniscribe.cc |    2 +-
 6 files changed, 31 insertions(+), 6 deletions(-)

New commits:
commit 38fb30d7420a4b01f99cee31baa8c3990a1d1c5f
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed Aug 6 13:34:49 2014 -0400

    Use atexit() only if it's safe to call from shared library
    
    Apparently they are not (advertised as?) safe on BSD systems.
    We ignore the case of static libraries.
    
    Whitelisted on glibc, Android, and MSVC / mingw.
    
    https://bugs.freedesktop.org/show_bug.cgi?id=82246

diff --git a/src/hb-common.cc b/src/hb-common.cc
index a089e52..a6a5144 100644
--- a/src/hb-common.cc
+++ b/src/hb-common.cc
@@ -234,7 +234,7 @@ struct hb_language_item_t {
 
 static hb_language_item_t *langs;
 
-#ifdef HAVE_ATEXIT
+#ifdef HB_USE_ATEXIT
 static inline
 void free_langs (void)
 {
@@ -269,7 +269,7 @@ retry:
     goto retry;
   }
 
-#ifdef HAVE_ATEXIT
+#ifdef HB_USE_ATEXIT
   if (!first_lang)
     atexit (free_langs); /* First person registers atexit() callback. */
 #endif
diff --git a/src/hb-ft.cc b/src/hb-ft.cc
index 44e0b0b..16bf51f 100644
--- a/src/hb-ft.cc
+++ b/src/hb-ft.cc
@@ -455,7 +455,7 @@ retry:
       goto retry;
     }
 
-#ifdef HAVE_ATEXIT
+#ifdef HB_USE_ATEXIT
     atexit (free_ft_library); /* First person registers atexit() callback. */
 #endif
   }
diff --git a/src/hb-private.hh b/src/hb-private.hh
index 5a4ca69..1b39e57 100644
--- a/src/hb-private.hh
+++ b/src/hb-private.hh
@@ -130,6 +130,31 @@
 #  define STRICT
 #endif
 
+#if HAVE_ATEXIT
+/* atexit() is only safe to be called from shared libraries on certain
+ * platforms.  Whitelist.
+ * https://bugs.freedesktop.org/show_bug.cgi?id=82246 */
+#  if defined(__linux) && defined(__GLIBC_PREREQ)
+#    if __GLIBC_PREREQ(2,3)
+/* From atexit() manpage, it's safe with glibc 2.2.3 on Linux. */
+#      define HB_USE_ATEXIT 1
+#    endif
+#  elif defined(_MSC_VER) || defined(__MINGW32__)
+/* For MSVC:
+ * http://msdn.microsoft.com/en-ca/library/tze57ck3.aspx
+ * http://msdn.microsoft.com/en-ca/library/zk17ww08.aspx
+ * mingw32 headers say atexit is safe to use in shared libraries.
+ */
+#    define HB_USE_ATEXIT 1
+#  elif defined(__ANDROID__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
+/* This was fixed in Android NKD r8 or r8b:
+ * https://code.google.com/p/android/issues/detail?id=6455
+ * which introduced GCC 4.6:
+ * https://developer.android.com/tools/sdk/ndk/index.html
+ */
+#    define HB_USE_ATEXIT 1
+#  endif
+#endif
 
 /* Basics */
 
diff --git a/src/hb-shape.cc b/src/hb-shape.cc
index 812cf59..74747f8 100644
--- a/src/hb-shape.cc
+++ b/src/hb-shape.cc
@@ -320,7 +320,7 @@ retry:
       goto retry;
     }
 
-#ifdef HAVE_ATEXIT
+#ifdef HB_USE_ATEXIT
     atexit (free_static_shaper_list); /* First person registers atexit() callback. */
 #endif
   }
diff --git a/src/hb-shaper.cc b/src/hb-shaper.cc
index 44f718a..6ae2601 100644
--- a/src/hb-shaper.cc
+++ b/src/hb-shaper.cc
@@ -100,7 +100,7 @@ retry:
       goto retry;
     }
 
-#ifdef HAVE_ATEXIT
+#ifdef HB_USE_ATEXIT
     atexit (free_static_shapers); /* First person registers atexit() callback. */
 #endif
   }
diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc
index 6bf87a5..0a2b481 100644
--- a/src/hb-uniscribe.cc
+++ b/src/hb-uniscribe.cc
@@ -245,7 +245,7 @@ retry:
       goto retry;
     }
 
-#ifdef HAVE_ATEXIT
+#ifdef HB_USE_ATEXIT
     atexit (free_uniscribe_funcs); /* First person registers atexit() callback. */
 #endif
   }


More information about the HarfBuzz mailing list