summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/pbd/malign.cc35
-rw-r--r--libs/pbd/pbd/malign.h8
2 files changed, 43 insertions, 0 deletions
diff --git a/libs/pbd/malign.cc b/libs/pbd/malign.cc
new file mode 100644
index 0000000000..cd3459a8b2
--- /dev/null
+++ b/libs/pbd/malign.cc
@@ -0,0 +1,35 @@
+#include <cstring>
+#include <cerrno>
+
+#include "pbd/malign.h"
+#include "pbd/error.h"
+
+#include "i18n.h"
+
+using namespace PBD;
+
+#ifdef __x86_64__
+static const int CPU_CACHE_ALIGN = 64;
+#else
+static const int CPU_CACHE_ALIGN = 16; /* arguably 32 on most arches, but it matters less */
+#endif
+
+int cache_aligned_malloc (void** memptr, size_t size)
+{
+#ifdef NO_POSIX_MEMALIGN
+ if (((*memptr) = malloc (size)) == 0) {
+ fatal << string_compose (_("Memory allocation error: malloc (%1 * %2) failed (%3)"),
+ CPU_CACHE_ALIGN, size, strerror (errno)) << endmsg;
+ return errno;
+ } else {
+ return 0;
+ }
+#else
+ if (posix_memalign (memptr, CPU_CACHE_ALIGN, size)) {
+ fatal << string_compose (_("Memory allocation error: posix_memalign (%1 * %2) failed (%3)"),
+ CPU_CACHE_ALIGN, size, strerror (errno)) << endmsg;
+ }
+
+ return 0;
+#endif
+}
diff --git a/libs/pbd/pbd/malign.h b/libs/pbd/pbd/malign.h
new file mode 100644
index 0000000000..97e68c076e
--- /dev/null
+++ b/libs/pbd/pbd/malign.h
@@ -0,0 +1,8 @@
+#ifndef __pbd_malign_h__
+#define __pbd_malign_h__
+
+#include <stdlib.h>
+
+int cache_aligned_malloc (void** memptr, size_t size);
+
+#endif /* __pbd_malign_h__ */