Free all static memory upon exit
diff --git a/src/hb-common.cc b/src/hb-common.cc
index f2347d5..afbe941 100644
--- a/src/hb-common.cc
+++ b/src/hb-common.cc
@@ -161,8 +161,10 @@
   void finish (void) { free (lang); }
 };
 
-static hb_static_mutex_t langs_lock;
-static hb_lockable_set_t<hb_language_item_t, hb_static_mutex_t> langs;
+static struct hb_static_lang_set_t : hb_lockable_set_t<hb_language_item_t, hb_static_mutex_t> {
+  ~hb_static_lang_set_t (void) { this->finish (lock); }
+  hb_static_mutex_t lock;
+} langs;
 
 hb_language_t
 hb_language_from_string (const char *str)
@@ -170,7 +172,7 @@
   if (!str || !*str)
     return HB_LANGUAGE_INVALID;
 
-  hb_language_item_t *item = langs.find_or_insert (str, langs_lock);
+  hb_language_item_t *item = langs.find_or_insert (str, langs.lock);
 
   return likely (item) ? item->lang : HB_LANGUAGE_INVALID;
 }
diff --git a/src/hb-shape.cc b/src/hb-shape.cc
index 986dd70..9e4469d 100644
--- a/src/hb-shape.cc
+++ b/src/hb-shape.cc
@@ -60,8 +60,8 @@
 };
 #undef HB_SHAPER_IMPLEMENT
 
-static class static_shaper_list_t {
-  public:
+static struct static_shaper_list_t
+{
   static_shaper_list_t (void)
   {
     char *env = getenv ("HB_SHAPER_LIST");