51 #ifndef AA_ALLOC_STACK_MAX
53 #define AA_ALLOC_STACK_MAX (4096-64)
78 void *p = malloc(size);
79 if(p) memset(p,0,size);
86 if( NULL != ptr ) free(ptr);
90 #define AA_NEW_AR(type,n) ( (type*) malloc(sizeof(type)*(n)) )
93 #define AA_NEW0_AR(type,n) ( (type*) aa_malloc0(sizeof(type)*(n)) )
96 #define AA_NEW(type) AA_NEW_AR(type,1)
99 #define AA_NEW0(type) AA_NEW0_AR(type,1)
103 #define AA_ALIGN2( val, align ) (((val) + (align) - 1) & ~(align-1))
125 #define AA_ALLOCAL(size) ({ size_t aa_$_allocal_size = (size); \
126 aa_$_allocal_size > AA_ALLOC_STACK_MAX ? \
127 malloc(aa_$_allocal_size) : alloca(aa_$_allocal_size); })
133 #define AA_NEW_LOCAL(type, n) ( (type*) AA_ALLOCAL( sizeof(type)*(n) ) )
145 #define AA_DEL_LOCAL(ptr, type, n) aa_frlocal( ptr, sizeof(type)*(n) )
164 #define AA_MEMREG_ALIGN 16
351 #define AA_MEM_REGION_NEW( reg, type ) ( (type*) aa_mem_region_alloc((reg), sizeof(type)) )
356 #define AA_MEM_REGION_ZNEW( reg, type ) \
357 ( (type*) aa_mem_region_zalloc((reg), sizeof(type)) )
362 #define AA_MEM_REGION_NEW_CPY( reg, src, type ) ( (type*) aa_mem_region_dup((reg), (src), sizeof(type)) )
367 #define AA_MEM_REGION_DUP( reg, type, src, count ) ( (type*) aa_mem_region_dup((reg), (src), (count)*sizeof(type)) )
372 #define AA_MEM_REGION_NEW_N( reg, type, n ) ( (type*) aa_mem_region_alloc((reg), (n)*sizeof(type)) )
377 #define AA_MEM_REGION_ZNEW_N( reg, type, n ) ( (type*) aa_mem_region_zalloc((reg), (n)*sizeof(type)) )
382 #define AA_MEM_REGION_LOCAL_NEW( type ) ( (type*) aa_mem_region_local_alloc( sizeof(type)) )
387 #define AA_MEM_REGION_LOCAL_NEW_N( type, n ) ( (type*) aa_mem_region_local_alloc( (n)*sizeof(type)) )
495 void (*
function)(
void *cx,
void *element ),
505 #define AA_RLIST_DEF( element_type, list_type ) \
507 aa_mem_rlist_t rlist; \
509 static inline list_type* \
510 list_type ## _alloc( aa_mem_region *reg ) \
512 return (list_type*)aa_mem_rlist_alloc(reg); \
523 #define AA_MEM_CPY(dst, src, n_elem) \
526 memcpy( (dst), (src), sizeof((dst)[0])*(n_elem) ); \
531 static inline void *
aa_mem_dup(
const void *src,
size_t size )
533 void *dst = malloc(size);
534 memcpy(dst,src,size);
541 #define AA_MEM_DUP( type, src, count ) \
542 ((type*)aa_mem_dup((src), sizeof(type)*(count)))
544 #define AA_MEM_DUPOP( refop, type, const_dst, dst_data, src, n_elem ) \
547 dst_data = AA_MEM_DUP(type, src, n_elem); \
548 const_dst = dst_data; \
552 const_dst = dst_data; \
554 case AA_MEM_BORROW: \
566 #define AA_MEM_SET(dst, val, n_elem) \
568 for( size_t aa_$_set_i = 0; \
569 aa_$_set_i < (n_elem); \
571 (dst)[aa_$_set_i] = (val); \
578 #define AA_MEM_ZERO(dst, n_elem) (memset((dst),0,(n_elem)*sizeof(*(dst))))
588 #define AA_FAR(...) (aa_far_deprecated(((double[]){__VA_ARGS__})))
592 static inline void aa_fcpy(
double *dst,
const double *src,
size_t n ) {
598 static inline void aa_fset(
double *dst,
double val,
size_t n ) {
604 static inline void aa_zero(
void *p,
size_t n ) {
610 static inline void aa_fzero(
double *p,
size_t n ) {
615 #define AA_ZERO_AR( var ) aa_zero( var, sizeof(var) )
618 #define AA_SET_AR( var, val ) \
619 for( size_t aa_$_set_ar_i = 0; \
620 aa_$_set_ar_i < sizeof(var)/sizeof(var[0]); \
621 aa_$_set_ar_i ++ ) var[aa_$_set_ar_i] = val;
632 #define AA_BITS_BITS (8*sizeof(aa_bits))
639 if( words*
sizeof(
aa_bits)*8 < n ) words++;
650 #define AA_BITS_JK( i, j, k ) \
651 j = (i) / AA_BITS_BITS; \
652 k = (i) - (j)*AA_BITS_BITS;
663 return (b[j] >> k) & 0x1;
690 b[j] &= ~ ( 0x1<<k );
702 a[n_words] &= b[n_words];
714 a[n_words] |= b[n_words];
726 a[n_words] ^= b[n_words];
746 for(
size_t i = 0; i < size/
sizeof(*la); i++ ) {
752 uint8_t *ca = (uint8_t*)a, *cb = (uint8_t*)b;
753 for(
size_t i = size - size%
sizeof(*la); i < size; i ++ ) {
762 #define AA_MEM_SWAP( a, b, n_elem ) (aa_memswap( (a), (b), n_elem*sizeof(*(a)) ))
780 #define AA_VECTOR_PUSH( max, size, ptr, value ) \
781 if( (size) >= (max) ) { \
782 (max) = 2*(size+1); \
783 (ptr) = (__typeof__(ptr))realloc(ptr,sizeof(*ptr)*max); \
785 ptr[(size)++] = (value);
787 #define AA_VECTOR_DEF( element_type, vector_type ) \
791 element_type *data; \
793 static inline void vector_type ## _init \
794 ( vector_type *vec, size_t max ) { \
795 vec->data = (element_type*)malloc(max*sizeof(*vec->data)); \
797 vec->size = (size_t)0; \
799 static inline void vector_type ## _push \
800 ( vector_type *vec, element_type value ) { \
801 AA_VECTOR_PUSH(vec->max, vec->size, vec->data, value); \
#define AA_API
calling and name mangling convention for functions
#define AA_RESTRICT
Defined restrict keyword based on language flavor.
AA_EXTERN const char *aa_verbf_prefix AA_DEPRECATED
don't use
AA_API size_t aa_circbuf_space(aa_circbuf_t *cb)
untested
AA_API void aa_mem_region_local_init(size_t size)
Initialize the thread-local memory region.
AA_API void * aa_mem_region_tmprealloc(aa_mem_region_t *region, size_t size)
Temporary allocation, ensuring that there is enough room for size bytes.
AA_API void aa_mem_region_pop(aa_mem_region_t *region, void *ptr)
Deallocates ptr and all blocks allocated after ptr was allocated.
static void aa_fcpy(double *dst, const double *src, size_t n) AA_DEPRECATED
copy n double floats from src to dst
AA_API void * aa_mem_region_local_alloc(size_t size)
Allocate from thread-local memory region.
AA_API void * aa_mem_pool_alloc(aa_mem_pool_t *pool)
untested
static void aa_free_if_valid(void *ptr)
Frees ptr unless NULL == ptr.
AA_API int aa_circbuf_read(aa_circbuf_t *cb, int fd, size_t n)
untested
int aa_bits
An integer type for bit vectors.
#define AA_ALLOC_STACK_MAX
maximum size of objects to stack allocate
AA_API char * aa_mem_region_vprintf(aa_mem_region_t *reg, const char *fmt, va_list ap)
printf's into a buffer allocated from region
static void aa_fset(double *dst, double val, size_t n) AA_DEPRECATED
set n double floats to val
AA_API void * aa_mem_region_zalloc(aa_mem_region_t *region, size_t size)
Allocate size bytes from the region and zero-initialize.
AA_API struct aa_mem_rlist * aa_mem_rlist_alloc(struct aa_mem_region *reg)
Allocate rlist out of region.
AA_API aa_mem_region_t * aa_mem_region_local_get(void)
Return pointer to a thread-local memory region.
#define AA_MEM_CPY(dst, src, n_elem)
Copy n_elem elements from src to dst.
AA_API void * aa_mem_region_tmpalloc(aa_mem_region_t *region, size_t size)
Temporary allocation.
#define AA_BITS_BITS
Number of bits in a aa_bits word.
static void * aa_malloc0(size_t size)
Malloc and zero initialize size bytes.
AA_API void aa_mem_pool_free(aa_mem_pool_t *pool, void *ptr)
untested
AA_API struct aa_mem_region * aa_mem_region_create(size_t size)
Allocate and initialize memory region with an initial chunk of size bytes.
AA_API void aa_mem_pool_init(aa_mem_pool_t *pool, size_t size, size_t count)
untested
static size_t aa_bits_size(size_t n_bits)
Size of bit vector in octets.
AA_API void aa_mem_rlist_enqueue_cpy(struct aa_mem_rlist *list, const void *p, size_t n)
Enqueue a copy of data at p at the back of the list.
long aa_memswap_type
Type to use for memory swapping.
struct aa_mem_cons aa_mem_cons_t
A "cons" cell.
AA_API void aa_mem_region_local_release(void)
Release all objects allocated from thread-local memory region.
static void aa_zero(void *p, size_t n) AA_DEPRECATED
set n bytes of p to zero
static size_t aa_bits_words(size_t n)
Number of aa_bits words to store n bits.
AA_API size_t aa_circbuf_used(aa_circbuf_t *cb)
untested
AA_API void aa_mem_rlist_enqueue_ptr(struct aa_mem_rlist *list, void *p)
Enqueue a the pointer p at the back of the list.
AA_API void aa_mem_pool_destroy(aa_mem_pool_t *pool)
untested
AA_API size_t aa_mem_region_topsize(aa_mem_region_t *region) AA_DEPRECATED
Size of top chunk in region.
AA_API aa_flexbuf_t * aa_flexbuf_alloc(size_t n)
allocate buffer of n bytes
AA_API void aa_mem_rlist_push_ptr(struct aa_mem_rlist *list, void *p)
Push the pointer p to the front of the list.
AA_API void aa_mem_region_local_pop(void *ptr)
Pop ptr from thread-local memory region.
AA_API void * aa_mem_region_dup(aa_mem_region_t *region, const void *p, size_t size)
Duplicate size bytes at p, allocated out of region.
AA_API void aa_mem_region_local_destroy(void)
Destroy the thread-local memory region.
AA_API void aa_mem_region_release(aa_mem_region_t *region)
Deallocates all allocated objects from the region.
AA_API void * aa_mem_region_ptr(aa_mem_region_t *region)
Pointer to start of free space in region.
static void aa_bits_or(aa_bits *a, const aa_bits *b, size_t n_bits)
Compute the bitwise OR of a and b, storing the result in a.
struct aa_mem_rlist aa_mem_rlist_t
A linked list allocated out of a memory region.
AA_API void aa_flexbuf_free(aa_flexbuf_t *p)
free buffer
AA_API void aa_circbuf_create(aa_circbuf_t *cb, size_t n)
untested
static void aa_bits_and(aa_bits *a, const aa_bits *b, size_t n_bits)
Compute the bitwise AND of a and b, storing the result in a.
AA_API void * aa_mem_rlist_pop(struct aa_mem_rlist *list)
Remove front element of the list and return its data pointer.
static void aa_frlocal(void *ptr, size_t size)
Free the results of AA_ALLOCAL.
AA_API void aa_circbuf_realloc(aa_circbuf_t *cb, size_t n)
untested
struct aa_mem_region aa_mem_region_t
Data Structure for Region-Based memory allocation.
AA_API void * aa_mem_region_local_tmpalloc(size_t size)
Temporary allocate from thread-local memory region.
AA_API size_t aa_mem_region_freesize(aa_mem_region_t *region)
Number of free contiguous bytes in region.
AA_API size_t aa_mem_region_chunk_count(aa_mem_region_t *region)
Number of chunks in the region.
AA_API void aa_mem_region_init(aa_mem_region_t *region, size_t size)
Initialize memory region with an initial chunk of size bytes.
static void aa_checked_free(void *ptr)
Free ptr if non-NULL.
static int aa_bits_get(aa_bits *b, size_t i)
Return the value of the i'th bit in bitset b.
AA_API int aa_circbuf_write(aa_circbuf_t *cb, int fd, size_t n)
untested
static AA_DEPRECATED double * aa_far_deprecated(double *x)
Helper for AA_FAR to warn deprecation.
static void aa_bits_xor(aa_bits *a, const aa_bits *b, size_t n_bits)
Compute the bitwise XOR of a and b, storing the result in a.
#define AA_MEM_SET(dst, val, n_elem)
Set n_elem elements at dst to val.
AA_API void aa_mem_region_destroy(aa_mem_region_t *region)
Destroy memory region freeing all chunks.
AA_API char * aa_mem_region_strdup(aa_mem_region_t *region, const char *str)
Duplicate a string, allocating from the region.
AA_API void aa_mem_pool_release(aa_mem_pool_t *pool)
untested
static void aa_fzero(double *p, size_t n) AA_DEPRECATED
zero array p of length n
static int aa_bits_getn(aa_bits *b, size_t n, size_t i)
Return the value of the i'th bit in bitset b of size n.
AA_API void aa_mem_rlist_map(struct aa_mem_rlist *list, void(*function)(void *cx, void *element), void *cx)
Apply function to each element of list.
AA_API void aa_circbuf_destroy(aa_circbuf_t *cb, size_t n)
untested
AA_API void * aa_mem_region_alloc(aa_mem_region_t *region, size_t size)
Allocate size bytes from the region.
AA_API void aa_circbuf_put(aa_circbuf_t *cb, void *buf, size_t n)
untested
static void aa_bits_set(aa_bits *b, size_t i, int val)
Set the value of the i'th bit in bitset b to val.
AA_API char * aa_mem_region_printf(aa_mem_region_t *region, const char *fmt,...)
printf's into a buffer allocated from region
static void aa_memswap(void *AA_RESTRICT a, void *AA_RESTRICT b, size_t size)
Swap size bytes of memory at a and b.
AA_API void aa_mem_rlist_push_cpy(struct aa_mem_rlist *list, void *p, size_t n)
Push a copy of data at p to the front of the list.
static void * aa_mem_dup(const void *src, size_t size)
Copy n octets from src into freshly-allocated heap memory.
Circular buffers use a fixed-size array that acts as if connected end-to end.
size_t start
start of filled data
size_t n
size of the circbuf
size_t end
end of filled data
uint64_t dalign
dummy element for alignment
struct aa_mem_cons * next
pointer to next list cell
void * data
pointer to data
Data Structure for Object pools.
size_t size
size of each element
aa_mem_region_t region
memory region to allocate from
void * top
top of list of free elements
A single block of memory to be parceled out by the region allocator.
uint8_t * end
pointer to end of this chunk
struct aa_mem_region_node * next
pointer to next chunk node
Data Structure for Region-Based memory allocation.
unsigned free_on_destroy
Free struct when calling aa_mem_region_destroy().
uint8_t * head
pointer to first free element of top chunk
struct aa_mem_region_node * node
linked list of chunks
int reserved
Reserve space for other bits.
A linked list allocated out of a memory region.