Skip to content
Browse files

Handle platforms (like Darwin 9) that do not have posix_memalign

  • Loading branch information...
1 parent 26fc886 commit 10332ec61ff19b9c00a9fe18c7f9fb2d5d99f896 @quentinmit quentinmit committed Mar 23, 2012
Showing with 19 additions and 1 deletion.
  1. +1 −1 configure.ac
  2. +18 −0 src/crypto/crypto.cc
View
2 configure.ac
@@ -113,7 +113,7 @@ AC_FUNC_FORK
AC_FUNC_MALLOC
AC_FUNC_MBRTOWC
AC_FUNC_REALLOC
-AC_CHECK_FUNCS([gettimeofday setrlimit inet_ntoa iswprint memchr memset nl_langinfo setenv setlocale sigaction socket strchr strdup strerror strtol wcwidth])
+AC_CHECK_FUNCS([gettimeofday setrlimit inet_ntoa iswprint memchr memset nl_langinfo posix_memalign setenv setlocale sigaction socket strchr strdup strerror strtol wcwidth])
AC_SEARCH_LIBS([clock_gettime], [rt], [AC_DEFINE([HAVE_CLOCK_GETTIME], [1], [Define if clock_gettime is available.])])
View
18 src/crypto/crypto.cc
@@ -50,9 +50,27 @@ static void * sse_alloc( int len )
{
void *ptr = NULL;
+#if defined(HAVE_POSIX_MEMALIGN)
if( (0 != posix_memalign( (void **)&ptr, 16, len )) || (ptr == NULL) ) {
throw std::bad_alloc();
}
+#else
+ // Some platforms will align malloc. Let's try that first.
+ if( ! (ptr = malloc(len)) ) {
+ throw std::bad_alloc();
+ }
+ if( (size_t)ptr & 0xF ) {
+ // The pointer wasn't 16-byte aligned, so try again with valloc
+ free(ptr);
+ if( ! (ptr = valloc(len)) ) {
+ throw std::bad_alloc();
+ }
+ if( (size_t)ptr & 0xF ) {
+ free(ptr);
+ throw std::bad_alloc();
+ }
+ }
+#endif /* !defined(HAVE_POSIX_MEMALIGN) */
return ptr;
}

0 comments on commit 10332ec

Please sign in to comment.
Something went wrong with that request. Please try again.