diff options
-rw-r--r-- | libs/pbd/malign.cc | 35 | ||||
-rw-r--r-- | libs/pbd/pbd/malign.h | 8 |
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__ */ |