aboutsummaryrefslogtreecommitdiffstats
path: root/src/zix/allocator.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/zix/allocator.c')
-rw-r--r--src/zix/allocator.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/zix/allocator.c b/src/zix/allocator.c
new file mode 100644
index 0000000..310ef33
--- /dev/null
+++ b/src/zix/allocator.c
@@ -0,0 +1,96 @@
+// Copyright 2011-2021 David Robillard <d@drobilla.net>
+// SPDX-License-Identifier: ISC
+
+#include "zix/allocator.h"
+
+#include "zix/attributes.h"
+
+#include "jalv_config.h"
+
+#ifdef _WIN32
+# define WIN32_LEAN_AND_MEAN 1
+# include <malloc.h>
+# include <windows.h>
+#endif
+
+#include <stdlib.h>
+
+ZIX_MALLOC_FUNC
+static void*
+zix_default_malloc(ZixAllocator* const allocator, const size_t size)
+{
+ (void)allocator;
+ return malloc(size);
+}
+
+ZIX_MALLOC_FUNC
+static void*
+zix_default_calloc(ZixAllocator* const allocator,
+ const size_t nmemb,
+ const size_t size)
+{
+ (void)allocator;
+ return calloc(nmemb, size);
+}
+
+static void*
+zix_default_realloc(ZixAllocator* const allocator,
+ void* const ptr,
+ const size_t size)
+{
+ (void)allocator;
+ return realloc(ptr, size);
+}
+
+static void
+zix_default_free(ZixAllocator* const allocator, void* const ptr)
+{
+ (void)allocator;
+ free(ptr);
+}
+
+ZIX_MALLOC_FUNC
+static void*
+zix_default_aligned_alloc(ZixAllocator* const allocator,
+ const size_t alignment,
+ const size_t size)
+{
+ (void)allocator;
+
+#if defined(_WIN32)
+ return _aligned_malloc(size, alignment);
+#elif USE_POSIX_MEMALIGN
+ void* ptr = NULL;
+ const int ret = posix_memalign(&ptr, alignment, size);
+ return ret ? NULL : ptr;
+#else
+ return NULL;
+#endif
+}
+
+static void
+zix_default_aligned_free(ZixAllocator* const allocator, void* const ptr)
+{
+ (void)allocator;
+
+#if defined(_WIN32)
+ _aligned_free(ptr);
+#else
+ free(ptr);
+#endif
+}
+
+ZixAllocator*
+zix_default_allocator(void)
+{
+ static ZixAllocator default_allocator = {
+ zix_default_malloc,
+ zix_default_calloc,
+ zix_default_realloc,
+ zix_default_free,
+ zix_default_aligned_alloc,
+ zix_default_aligned_free,
+ };
+
+ return &default_allocator;
+}