14 #ifndef STXXL_COMMON_ALIGNED_ALLOC_HEADER 
   15 #define STXXL_COMMON_ALIGNED_ALLOC_HEADER 
   22 #ifndef STXXL_VERBOSE_ALIGNED_ALLOC 
   23 #define STXXL_VERBOSE_ALIGNED_ALLOC STXXL_VERBOSE2 
   28 template <
typename MustBeInt>
 
   33 template <
typename MustBeInt>
 
   47 template <
size_t Alignment>
 
   50     STXXL_VERBOSE2(
"stxxl::aligned_alloc<" << Alignment << 
">(), size = " << size << 
", meta info size = " << meta_info_size);
 
   51 #if !defined(STXXL_WASTE_MORE_MEMORY_FOR_IMPROVED_ACCESS_AFTER_ALLOCATED_MEMORY_CHECKS) 
   57     size_t alloc_size = Alignment + 
sizeof(
char*) + meta_info_size + size;
 
   58     char* buffer = (
char*)std::malloc(alloc_size);
 
   68     size_t alloc_size = Alignment * 
div_ceil(
sizeof(
char*) + meta_info_size, Alignment) + size;
 
   70     if (posix_memalign((
void**)&buffer, Alignment, alloc_size) != 0)
 
   71         throw std::bad_alloc();
 
   74         throw std::bad_alloc();
 
   75     #ifdef STXXL_ALIGNED_CALLOC 
   76     memset(buffer, 0, alloc_size);
 
   78     char* reserve_buffer = buffer + 
sizeof(
char*) + meta_info_size;
 
   79     char* result = reserve_buffer + Alignment -
 
   80                    (((
unsigned_type)reserve_buffer) % (Alignment)) - meta_info_size;
 
   81     STXXL_VERBOSE2(
"stxxl::aligned_alloc<" << Alignment << 
">() address " << (
void*)result << 
" lost " << (result - buffer) << 
" bytes");
 
   85     assert(
long(result - buffer) >= 
long(
sizeof(
char*)));
 
   89     size_t realloc_size = (result - buffer) + meta_info_size + size;
 
   91         char* realloced = (
char*)std::realloc(buffer, realloc_size);
 
   92         if (buffer != realloced) {
 
   95             STXXL_ERRMSG(
"stxxl::aligned_alloc: disabling realloc()");
 
   98             return aligned_alloc<Alignment>(size, meta_info_size);
 
  100         assert(result + size <= buffer + realloc_size);
 
  103     *(((
char**)result) - 1) = buffer;
 
  105         "stxxl::aligned_alloc<" << Alignment << 
">(), allocated at " <<
 
  106         (
void*)buffer << 
" returning " << (
void*)result);
 
  108         "stxxl::aligned_alloc<" << Alignment <<
 
  109         ">(size = " << size << 
", meta info size = " << meta_info_size <<
 
  110         ") => buffer = " << (
void*)buffer << 
", ptr = " << (
void*)result);
 
  115 template <
size_t Alignment>
 
  121     char* buffer = *(((
char**)ptr) - 1);
 
  128 #endif // !STXXL_COMMON_ALIGNED_ALLOC_HEADER 
compat::remove_const< Integral >::type div_ceil(Integral n, Integral2 d)
static bool may_use_realloc
#define STXXL_VERBOSE2(x)
#define STXXL_VERBOSE_ALIGNED_ALLOC
#define STXXL_BEGIN_NAMESPACE
choose_int_types< my_pointer_size >::unsigned_type unsigned_type
void * aligned_alloc(size_t size, size_t meta_info_size=0)
void aligned_dealloc(void *ptr)
#define STXXL_END_NAMESPACE