the endless quest to plug memory leaks -- episode 379
[ardour.git] / libs / pbd / malign.cc
index a5f966c0c509db146c3f79eff97dde09ce12c637..59c6c4469ef3f5b61260e7c8e475948b7c392319 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012 Paul Davis 
+    Copyright (C) 2012 Paul Davis
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
 #include "pbd/malign.h"
 #include "pbd/error.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 
@@ -62,7 +62,7 @@ int cache_aligned_malloc (void** memptr, size_t size)
        }
 
        return 0;
-#endif 
+#endif
 }
 
 void cache_aligned_free (void* memptr)
@@ -72,4 +72,43 @@ void cache_aligned_free (void* memptr)
 #else
        free (memptr);
 #endif
-}
\ No newline at end of file
+}
+
+int  aligned_malloc (void** memptr, size_t size, size_t alignment)
+{
+#ifndef HAVE_POSIX_MEMALIGN
+#ifdef PLATFORM_WINDOWS
+       if (((*memptr) = _aligned_malloc (size, alignment)) == 0) {
+               fatal << string_compose (_("Memory allocation error: malloc (%1 * %2) failed (%3)"),
+                                        alignment, size, strerror (errno)) << endmsg;
+               return errno;
+       } else {
+               return 0;
+       }
+#else
+       if (((*memptr) = malloc (size)) == 0) {
+               fatal << string_compose (_("Memory allocation error: malloc (%1 * %2) failed (%3)"),
+                                        alignment, size, strerror (errno)) << endmsg;
+               return errno;
+       } else {
+               return 0;
+       }
+#endif
+#else
+        if (posix_memalign (memptr, alignment, size)) {
+               fatal << string_compose (_("Memory allocation error: posix_memalign (%1 * %2) failed (%3)"),
+                                        alignment, size, strerror (errno)) << endmsg;
+       }
+
+       return 0;
+#endif
+}
+
+void aligned_free (void* memptr)
+{
+#ifdef PLATFORM_WINDOWS
+       _aligned_free (memptr);
+#else
+       free (memptr);
+#endif
+}