Allow multiple wimlib_global_init/cleanup per app
[wimlib] / src / encoding.c
index 8edf228817cba16e659ca47caed8d492e1de95cf..ff90a23b8ca74bdda4ff2fc763eb66142ce1d818 100644 (file)
@@ -68,8 +68,6 @@ struct iconv_node {
 struct iconv_list_head name = {                                \
        .from_encoding = from,                          \
        .to_encoding = to,                              \
-       .list = LIST_HEAD_INIT(name.list),              \
-       .mutex = PTHREAD_MUTEX_INITIALIZER,             \
 }
 
 static iconv_t *
@@ -363,6 +361,13 @@ utf8_to_tstr_simple(const char *utf8str, tchar **out)
        return utf8_to_tstr(utf8str, strlen(utf8str), out, &out_nbytes);
 }
 
+static void
+iconv_init(struct iconv_list_head *head)
+{
+       pthread_mutex_init(&head->mutex, NULL);
+       INIT_LIST_HEAD(&head->list);
+}
+
 static void
 iconv_cleanup(struct iconv_list_head *head)
 {
@@ -377,6 +382,19 @@ iconv_cleanup(struct iconv_list_head *head)
        }
 }
 
+void
+iconv_global_init(void)
+{
+       iconv_init(&iconv_utf8_to_tstr);
+       iconv_init(&iconv_tstr_to_utf8);
+#if !TCHAR_IS_UTF16LE
+       iconv_init(&iconv_utf16le_to_tstr);
+       iconv_init(&iconv_tstr_to_utf16le);
+       iconv_init(&iconv_utf16le_to_utf8);
+       iconv_init(&iconv_utf8_to_utf16le);
+#endif
+}
+
 void
 iconv_global_cleanup(void)
 {