| 1 | |
|---|
| 2 | #define MEM_ALLOC_NO_GUARDS 1 |
|---|
| 3 | |
|---|
| 4 | #include "axml.h" |
|---|
| 5 | |
|---|
| 6 | #include <stdio.h> |
|---|
| 7 | #include <stdlib.h> |
|---|
| 8 | #include <string.h> |
|---|
| 9 | |
|---|
| 10 | #if !defined(__APPLE__) |
|---|
| 11 | #include <malloc.h> |
|---|
| 12 | #endif |
|---|
| 13 | |
|---|
| 14 | |
|---|
| 15 | #ifdef _RAXML_USE_LLALLOC |
|---|
| 16 | |
|---|
| 17 | // the llalloc library implementation in lockless_alloc/ll_alloc.c exports the alloction functions prefixed |
|---|
| 18 | // with 'llalloc'. The following are the forward declarations of the llalloc* functions |
|---|
| 19 | |
|---|
| 20 | #define PREFIX(X) llalloc##X |
|---|
| 21 | |
|---|
| 22 | void *PREFIX(memalign)(size_t align, size_t size); |
|---|
| 23 | void *PREFIX(malloc)(size_t size); |
|---|
| 24 | void *PREFIX(realloc)(void *p, size_t size); |
|---|
| 25 | int PREFIX(posix_memalign)(void **p, size_t align, size_t size); |
|---|
| 26 | void *PREFIX(calloc)(size_t n, size_t size); |
|---|
| 27 | void PREFIX(free)(void *p); |
|---|
| 28 | |
|---|
| 29 | |
|---|
| 30 | // wrappers that forward the rax_* functions to the corresponding llalloc* functions |
|---|
| 31 | |
|---|
| 32 | |
|---|
| 33 | void *rax_memalign(size_t align, size_t size) |
|---|
| 34 | { |
|---|
| 35 | return PREFIX(memalign)(align, size); |
|---|
| 36 | } |
|---|
| 37 | |
|---|
| 38 | void *rax_malloc( size_t size ) |
|---|
| 39 | { |
|---|
| 40 | return PREFIX(malloc)(size); |
|---|
| 41 | } |
|---|
| 42 | void *rax_realloc( void *p, size_t size ) { |
|---|
| 43 | return PREFIX(realloc)(p, size); |
|---|
| 44 | } |
|---|
| 45 | |
|---|
| 46 | |
|---|
| 47 | void rax_free(void *p) { |
|---|
| 48 | PREFIX(free)(p); |
|---|
| 49 | } |
|---|
| 50 | |
|---|
| 51 | int rax_posix_memalign(void **p, size_t align, size_t size) { |
|---|
| 52 | return PREFIX(posix_memalign)(p, align, size); |
|---|
| 53 | } |
|---|
| 54 | void *rax_calloc(size_t n, size_t size) { |
|---|
| 55 | return PREFIX(calloc)(n,size); |
|---|
| 56 | } |
|---|
| 57 | |
|---|
| 58 | void *rax_malloc_aligned(size_t size) |
|---|
| 59 | { |
|---|
| 60 | const size_t BYTE_ALIGNMENT = 32; |
|---|
| 61 | return rax_memalign(BYTE_ALIGNMENT, size); |
|---|
| 62 | |
|---|
| 63 | } |
|---|
| 64 | |
|---|
| 65 | #else |
|---|
| 66 | // if llalloc should not be used, forward the rax_* functions to the corresponding standard function |
|---|
| 67 | |
|---|
| 68 | |
|---|
| 69 | |
|---|
| 70 | void *rax_malloc( size_t size ) |
|---|
| 71 | { |
|---|
| 72 | void |
|---|
| 73 | *ptr = (void *)NULL; |
|---|
| 74 | |
|---|
| 75 | int |
|---|
| 76 | res = posix_memalign(&ptr, BYTE_ALIGNMENT, size); |
|---|
| 77 | |
|---|
| 78 | if(res != 0) |
|---|
| 79 | assert(0); |
|---|
| 80 | |
|---|
| 81 | return ptr; |
|---|
| 82 | } |
|---|
| 83 | |
|---|
| 84 | void *rax_realloc(void *p, size_t size, boolean needsMemoryAlignment) |
|---|
| 85 | { |
|---|
| 86 | //it's actually not that easy to implement an aligned realloc |
|---|
| 87 | //because we need to know the size of the array pointed to by |
|---|
| 88 | //the pointer passed as argument |
|---|
| 89 | //hence I added this boolean flag that should increase programmer |
|---|
| 90 | //awareness about this issue |
|---|
| 91 | |
|---|
| 92 | if(needsMemoryAlignment) |
|---|
| 93 | { |
|---|
| 94 | assert(0); |
|---|
| 95 | return (void*)NULL; |
|---|
| 96 | } |
|---|
| 97 | else |
|---|
| 98 | return realloc(p, size); |
|---|
| 99 | } |
|---|
| 100 | |
|---|
| 101 | void rax_free(void *p) |
|---|
| 102 | { |
|---|
| 103 | free(p); |
|---|
| 104 | } |
|---|
| 105 | |
|---|
| 106 | void *rax_calloc(size_t n, size_t size) |
|---|
| 107 | { |
|---|
| 108 | void |
|---|
| 109 | *ptr = rax_malloc(size * n); |
|---|
| 110 | |
|---|
| 111 | if (ptr == (void*)NULL) |
|---|
| 112 | return (void*)NULL; |
|---|
| 113 | |
|---|
| 114 | memset(ptr, 0, size * n); |
|---|
| 115 | |
|---|
| 116 | return ptr; |
|---|
| 117 | } |
|---|
| 118 | |
|---|
| 119 | |
|---|
| 120 | |
|---|
| 121 | #endif |
|---|
| 122 | |
|---|
| 123 | |
|---|
| 124 | |
|---|