]> wimlib.net Git - wimlib/blobdiff - src/util.c
Add aligned malloc and free
[wimlib] / src / util.c
index fceae14b026b4aa196547dc0f815dad22622f668..54e29444655ada8905f3ca5f377a89e099821dbd 100644 (file)
@@ -37,6 +37,7 @@
 #endif
 
 #include "wimlib.h"
+#include "wimlib/assert.h"
 #include "wimlib/compiler.h"
 #include "wimlib/encoding.h"
 #include "wimlib/error.h"
@@ -432,6 +433,36 @@ wimlib_wcsdup(const wchar_t *str)
 }
 #endif
 
+void *
+wimlib_aligned_malloc(size_t size, size_t alignment)
+{
+       u8 *raw_ptr;
+       u8 *ptr;
+       uintptr_t mask;
+
+       wimlib_assert(alignment != 0 && is_power_of_2(alignment) &&
+                     alignment <= 4096);
+       mask = alignment - 1;
+
+       raw_ptr = MALLOC(size + alignment - 1 + sizeof(size_t));
+       if (!raw_ptr)
+               return NULL;
+
+       ptr = (u8 *)raw_ptr + sizeof(size_t);
+       while ((uintptr_t)ptr & mask)
+               ptr++;
+       *((size_t *)ptr - 1) = (ptr - raw_ptr);
+
+       return ptr;
+}
+
+void
+wimlib_aligned_free(void *ptr)
+{
+       if (ptr)
+               FREE((u8 *)ptr - *((size_t *)ptr - 1));
+}
+
 void *
 memdup(const void *mem, size_t size)
 {