4 #ifndef HAVE_POSIX_MEMALIGN
7 #if __GLIBC_PREREQ(2,3)
8 #define HAVE_POSIX_MEMALIGN
12 #define HAVE_POSIX_MEMALIGN
21 static const array1<Complex> NULL1;
22 static const array2<Complex> NULL2;
23 static const array3<Complex> NULL3;
28 #ifdef HAVE_POSIX_MEMALIGN
30 extern "C" int posix_memalign(
void **memptr,
size_t alignment,
size_t size);
39 if(alignment %
sizeof (
void *) != 0 || (alignment & (alignment - 1)) != 0)
41 void *p0=malloc(size+alignment);
42 if(!p0)
return ENOMEM;
43 void *
p=(
void *)(((
size_t) p0+alignment)&~(alignment-1));
51 if(p) free(*((
void **) p-1));
60 inline void newAlign(T *&v,
size_t len,
size_t align)
63 const char *invalid=
"Invalid alignment requested";
64 const char *nomem=
"Memory limits exceeded";
65 #ifdef HAVE_POSIX_MEMALIGN
66 int rc=posix_memalign(&mem,align,len*
sizeof(T));
70 if(rc == EINVAL) std::cerr << invalid << std::endl;
71 if(rc == ENOMEM) std::cerr << nomem << std::endl;
73 for(
size_t i=0; i < len; i++)
new(v+i) T;
79 for(
size_t i=len; i-- > 0;) v[i].~T();
80 #ifdef HAVE_POSIX_MEMALIGN
114 #ifdef HAVE_POSIX_MEMALIGN
unsigned int ceilquotient(unsigned int a, unsigned int b)
std::complex< double > Complex
int posix_memalign0(void **memptr, size_t alignment, size_t size)
void newAlign(T *&v, size_t len, size_t align)
Complex * ComplexAlign(size_t size)
double * doubleAlign(size_t size)
TabulatedPDF::Array Array
void deleteAlign(T *v, size_t len)