]> wimlib.net Git - wimlib/blobdiff - src/wim.c
Use native Windows threads on Windows
[wimlib] / src / wim.c
index 8c3dbfc4f17945803b169361e075e55dae1bf071..b1902f41b6c1898f25072d80b678ce1661c3d791 100644 (file)
--- a/src/wim.c
+++ b/src/wim.c
 
 #include <errno.h>
 #include <fcntl.h>
-#ifndef __WIN32__
-#  include <langinfo.h>
-#endif
-#include <pthread.h>
 #include <stdlib.h>
 #include <unistd.h>
 
 #include "wimlib.h"
 #include "wimlib/assert.h"
 #include "wimlib/blob_table.h"
+#include "wimlib/cpu_features.h"
 #include "wimlib/dentry.h"
 #include "wimlib/encoding.h"
 #include "wimlib/file_io.h"
 #include "wimlib/integrity.h"
 #include "wimlib/metadata.h"
 #include "wimlib/security.h"
+#include "wimlib/threads.h"
 #include "wimlib/wim.h"
 #include "wimlib/xml.h"
 #include "wimlib/win32.h"
@@ -175,31 +173,25 @@ wimlib_create_new_wim(enum wimlib_compression_type ctype, WIMStruct **wim_ret)
        if (!wim)
                return WIMLIB_ERR_NOMEM;
 
-       wim->xml_info = xml_new_info_struct();
-       wim->blob_table = new_blob_table(64);
-       if (!wim->xml_info || !wim->blob_table) {
-               wimlib_free(wim);
-               return WIMLIB_ERR_NOMEM;
-       }
-
-       /* Fill in wim->hdr with default values  */
+       /* Fill in wim->hdr with default values */
        wim->hdr.magic = WIM_MAGIC;
        wim->hdr.wim_version = WIM_VERSION_DEFAULT;
-       wim->hdr.flags = 0;
-       wim->hdr.chunk_size = 0;
-       generate_guid(wim->hdr.guid);
        wim->hdr.part_number = 1;
        wim->hdr.total_parts = 1;
-       wim->hdr.image_count = 0;
-       wim->hdr.boot_idx = 0;
-
        wim->compression_type = WIMLIB_COMPRESSION_TYPE_NONE;
-       wim->chunk_size = wim->hdr.chunk_size;
 
-       /* Set the output compression type  */
+       /* Set the output compression type */
        wim->out_compression_type = ctype;
        wim->out_chunk_size = wim_default_nonsolid_chunk_size(ctype);
 
+       /* Allocate an empty XML info and blob table */
+       wim->xml_info = xml_new_info_struct();
+       wim->blob_table = new_blob_table(64);
+       if (!wim->xml_info || !wim->blob_table) {
+               wimlib_free(wim);
+               return WIMLIB_ERR_NOMEM;
+       }
+
        *wim_ret = wim;
        return 0;
 }
@@ -944,8 +936,14 @@ wimlib_get_version(void)
                WIMLIB_PATCH_VERSION;
 }
 
+WIMLIBAPI const tchar *
+wimlib_get_version_string(void)
+{
+       return T(PACKAGE_VERSION);
+}
+
 static bool lib_initialized = false;
-static pthread_mutex_t lib_initialization_mutex = PTHREAD_MUTEX_INITIALIZER;
+static struct mutex lib_initialization_mutex = MUTEX_INITIALIZER;
 
 /* API function documented in wimlib.h  */
 WIMLIBAPI int
@@ -956,15 +954,13 @@ wimlib_global_init(int init_flags)
        if (lib_initialized)
                goto out;
 
-       pthread_mutex_lock(&lib_initialization_mutex);
+       mutex_lock(&lib_initialization_mutex);
 
        if (lib_initialized)
                goto out_unlock;
 
-#ifdef ENABLE_ERROR_MESSAGES
        if (!wimlib_error_file)
                wimlib_error_file = stderr;
-#endif
 
        ret = WIMLIB_ERR_INVALID_PARAM;
        if (init_flags & ~(WIMLIB_INIT_FLAG_ASSUME_UTF8 |
@@ -982,6 +978,7 @@ wimlib_global_init(int init_flags)
                            WIMLIB_INIT_FLAG_DEFAULT_CASE_INSENSITIVE))
                goto out_unlock;
 
+       init_cpu_features();
        xml_global_init();
 #ifdef __WIN32__
        ret = win32_global_init(init_flags);
@@ -996,7 +993,7 @@ wimlib_global_init(int init_flags)
        lib_initialized = true;
        ret = 0;
 out_unlock:
-       pthread_mutex_unlock(&lib_initialization_mutex);
+       mutex_unlock(&lib_initialization_mutex);
 out:
        return ret;
 }
@@ -1008,7 +1005,7 @@ wimlib_global_cleanup(void)
        if (!lib_initialized)
                return;
 
-       pthread_mutex_lock(&lib_initialization_mutex);
+       mutex_lock(&lib_initialization_mutex);
 
        if (!lib_initialized)
                goto out_unlock;
@@ -1022,5 +1019,5 @@ wimlib_global_cleanup(void)
        lib_initialized = false;
 
 out_unlock:
-       pthread_mutex_unlock(&lib_initialization_mutex);
+       mutex_unlock(&lib_initialization_mutex);
 }