amino  1.0-beta2
Lightweight Robot Utility Library
mem.h
Go to the documentation of this file.
1 /* -*- mode: C; c-basic-offset: 4 -*- */
2 /* ex: set shiftwidth=4 tabstop=4 expandtab: */
3 /*
4  * Copyright (c) 2010-2012, Georgia Tech Research Corporation
5  * All rights reserved.
6  *
7  * Author(s): Neil T. Dantam <ntd@gatech.edu>
8  * Georgia Tech Humanoid Robotics Lab
9  * Under Direction of Prof. Mike Stilman <mstilman@cc.gatech.edu>
10  *
11  *
12  * This file is provided under the following "BSD-style" License:
13  *
14  *
15  * Redistribution and use in source and binary forms, with or
16  * without modification, are permitted provided that the following
17  * conditions are met:
18  *
19  * * Redistributions of source code must retain the above copyright
20  * notice, this list of conditions and the following disclaimer.
21  *
22  * * Redistributions in binary form must reproduce the above
23  * copyright notice, this list of conditions and the following
24  * disclaimer in the documentation and/or other materials provided
25  * with the distribution.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
28  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
29  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
30  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
31  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
32  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
35  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
36  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
38  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39  * POSSIBILITY OF SUCH DAMAGE.
40  *
41  */
42 
43 #ifndef AA_MEM_H
44 #define AA_MEM_H
45 
51 #ifndef AA_ALLOC_STACK_MAX
53 #define AA_ALLOC_STACK_MAX (4096-64)
54 #endif //AA_ALLOC_STACK_MAX
55 
56 
57 enum aa_mem_refop {
58  /* Make a private copy */
59  AA_MEM_COPY,
60  /* Use the existing copy. Someone else will clean up */
61  AA_MEM_BORROW,
62  /* Take the reference and cleanup when we're done */
63  AA_MEM_STEAL
64 };
65 
66 /**************/
67 /* Allocation */
68 /**************/
69 
70 /*----------- General Allocation ------------------*/
71 
72 /* FIXME: we should do something reasonable when malloc() fails, but
73  since Linux lies about whether it can provide memory, there may be
74  no point. */
75 
77 static inline void *aa_malloc0( size_t size ) {
78  void *p = malloc(size);
79  if(p) memset(p,0,size);
80  return p;
81 }
82 
83 
85 static inline void aa_free_if_valid( void *ptr ) {
86  if( NULL != ptr ) free(ptr);
87 }
88 
90 #define AA_NEW_AR(type,n) ( (type*) malloc(sizeof(type)*(n)) )
91 
93 #define AA_NEW0_AR(type,n) ( (type*) aa_malloc0(sizeof(type)*(n)) )
94 
96 #define AA_NEW(type) AA_NEW_AR(type,1)
97 
99 #define AA_NEW0(type) AA_NEW0_AR(type,1)
100 
103 #define AA_ALIGN2( val, align ) (((val) + (align) - 1) & ~(align-1))
104 
106 static inline void aa_checked_free( void * ptr )
107 {
108  if( ptr ) free(ptr);
109 }
110 
111 /*----------- Local Allocation ------------------*/
112 
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); })
128 
133 #define AA_NEW_LOCAL(type, n) ( (type*) AA_ALLOCAL( sizeof(type)*(n) ) )
134 
140 static inline void aa_frlocal( void *ptr, size_t size ) {
141  if( size > AA_ALLOC_STACK_MAX) free(ptr);
142 }
143 
145 #define AA_DEL_LOCAL(ptr, type, n) aa_frlocal( ptr, sizeof(type)*(n) )
146 
148 typedef struct {
149  size_t n;
150  union {
151  uint64_t dalign;
152  uint8_t d[1];
153  };
154 } aa_flexbuf_t;
155 
160 
161 /*----------- Region Allocation ------------------*/
162 
164 #define AA_MEMREG_ALIGN 16
165 
171  //size_t n; ///< size of this chunk
172  uint8_t *end;
174  uint8_t d[];
175 };
176 
199 typedef struct aa_mem_region {
200  uint8_t *head;
202  union {
206  int reserved;
207  struct {
214  unsigned free_on_destroy;
215  };
216  };
218 
220 AA_API void aa_mem_region_init( aa_mem_region_t *region, size_t size );
221 
226 AA_API struct aa_mem_region *
227 aa_mem_region_create( size_t size );
228 
236 
237 
242 
247 AA_API void *aa_mem_region_tmpalloc( aa_mem_region_t *region, size_t size );
248 
253 AA_API void *aa_mem_region_alloc( aa_mem_region_t *region, size_t size );
254 
262 AA_API void *aa_mem_region_zalloc( aa_mem_region_t *region, size_t size );
263 
266 AA_API void *aa_mem_region_tmprealloc( aa_mem_region_t *region, size_t size );
267 
270 AA_API void *aa_mem_region_dup( aa_mem_region_t *region, const void *p, size_t size );
271 
274 AA_API char *aa_mem_region_strdup( aa_mem_region_t *region, const char *str );
275 
280 
283 AA_API char *aa_mem_region_printf( aa_mem_region_t *region, const char *fmt, ... );
284 
287 AA_API char* aa_mem_region_vprintf(aa_mem_region_t *reg, const char *fmt, va_list ap );
288 
291 AA_API void aa_mem_region_pop( aa_mem_region_t *region, void *ptr );
292 
293 
297 
301 
305 
306 
311 AA_API void aa_mem_region_local_init( size_t size );
312 
318 
322 
327 AA_API void *aa_mem_region_local_alloc( size_t size );
328 
334 
339 AA_API void aa_mem_region_local_pop( void *ptr );
340 
346 
347 
351 #define AA_MEM_REGION_NEW( reg, type ) ( (type*) aa_mem_region_alloc((reg), sizeof(type)) )
352 
356 #define AA_MEM_REGION_ZNEW( reg, type ) \
357  ( (type*) aa_mem_region_zalloc((reg), sizeof(type)) )
358 
362 #define AA_MEM_REGION_NEW_CPY( reg, src, type ) ( (type*) aa_mem_region_dup((reg), (src), sizeof(type)) )
363 
367 #define AA_MEM_REGION_DUP( reg, type, src, count ) ( (type*) aa_mem_region_dup((reg), (src), (count)*sizeof(type)) )
368 
372 #define AA_MEM_REGION_NEW_N( reg, type, n ) ( (type*) aa_mem_region_alloc((reg), (n)*sizeof(type)) )
373 
377 #define AA_MEM_REGION_ZNEW_N( reg, type, n ) ( (type*) aa_mem_region_zalloc((reg), (n)*sizeof(type)) )
378 
382 #define AA_MEM_REGION_LOCAL_NEW( type ) ( (type*) aa_mem_region_local_alloc( sizeof(type)) )
383 
387 #define AA_MEM_REGION_LOCAL_NEW_N( type, n ) ( (type*) aa_mem_region_local_alloc( (n)*sizeof(type)) )
388 
389 /*----------- Pooled Allocation ------------------*/
390 
399 typedef struct {
400  size_t size;
401  void *top;
403 } aa_mem_pool_t;
404 
406 AA_API void aa_mem_pool_init( aa_mem_pool_t *pool, size_t size, size_t count );
412 AA_API void aa_mem_pool_free( aa_mem_pool_t *pool, void *ptr );
415 
416 /*----------- Circular Buffers ------------------*/
420 typedef struct {
421  void *buf;
422  size_t n;
423  size_t start;
424  size_t end;
425 } aa_circbuf_t;
426 
428 AA_API void aa_circbuf_create( aa_circbuf_t *cb, size_t n );
430 AA_API void aa_circbuf_destroy( aa_circbuf_t *cb, size_t n );
432 AA_API void aa_circbuf_realloc( aa_circbuf_t *cb, size_t n );
438 AA_API void aa_circbuf_put( aa_circbuf_t *cb, void *buf, size_t n );
440 AA_API int aa_circbuf_read( aa_circbuf_t *cb, int fd, size_t n );
442 AA_API int aa_circbuf_write( aa_circbuf_t *cb, int fd, size_t n );
443 
444 
445 /***************/
446 /* Linked List */
447 /***************/
448 
451 typedef struct aa_mem_cons {
452  void *data;
453  struct aa_mem_cons *next;
455 
462 typedef struct aa_mem_rlist {
463  struct aa_mem_region *reg;
464  struct aa_mem_cons *head;
465  struct aa_mem_cons **tailp;
467 
473 AA_API struct aa_mem_rlist *
475 
477 AA_API void
478 aa_mem_rlist_push_cpy( struct aa_mem_rlist *list, void *p, size_t n );
479 
481 AA_API void
482 aa_mem_rlist_push_ptr( struct aa_mem_rlist *list, void *p );
483 
485 AA_API void
486 aa_mem_rlist_enqueue_cpy( struct aa_mem_rlist *list, const void *p, size_t n );
487 
489 AA_API void
490 aa_mem_rlist_enqueue_ptr( struct aa_mem_rlist *list, void *p );
491 
493 AA_API void
495  void (*function)(void *cx, void *element ),
496  void *cx );
497 
503 AA_API void *aa_mem_rlist_pop( struct aa_mem_rlist *list );
504 
505 #define AA_RLIST_DEF( element_type, list_type ) \
506  typedef struct { \
507  aa_mem_rlist_t rlist; \
508  } list_type; \
509  static inline list_type* \
510  list_type ## _alloc( aa_mem_region *reg ) \
511  { \
512  return (list_type*)aa_mem_rlist_alloc(reg); \
513  }
514 
515 /**********/
516 /* Arrays */
517 /**********/
518 
523 #define AA_MEM_CPY(dst, src, n_elem) \
524  { \
525  /* _Static_assert(sizeof(*dst) == sizeof(*src));*/ \
526  memcpy( (dst), (src), sizeof((dst)[0])*(n_elem) ); \
527  }
531 static inline void *aa_mem_dup( const void *src, size_t size )
532 {
533  void *dst = malloc(size);
534  memcpy(dst,src,size);
535  return dst;
536 }
537 
541 #define AA_MEM_DUP( type, src, count ) \
542  ((type*)aa_mem_dup((src), sizeof(type)*(count)))
543 
544 #define AA_MEM_DUPOP( refop, type, const_dst, dst_data, src, n_elem ) \
545  switch(refop) { \
546  case AA_MEM_COPY: \
547  dst_data = AA_MEM_DUP(type, src, n_elem); \
548  const_dst = dst_data; \
549  break; \
550  case AA_MEM_STEAL: \
551  dst_data = src; \
552  const_dst = dst_data; \
553  break; \
554  case AA_MEM_BORROW: \
555  dst_data = NULL; \
556  const_dst = src; \
557  break; \
558  };
559 
560 
561 
566 #define AA_MEM_SET(dst, val, n_elem) \
567  { \
568  for( size_t aa_$_set_i = 0; \
569  aa_$_set_i < (n_elem); \
570  aa_$_set_i++ ) \
571  (dst)[aa_$_set_i] = (val); \
572  }
573 
578 #define AA_MEM_ZERO(dst, n_elem) (memset((dst),0,(n_elem)*sizeof(*(dst))))
579 
581 AA_DEPRECATED static inline double *
582 aa_far_deprecated(double *x) { return x; }
583 
588 #define AA_FAR(...) (aa_far_deprecated(((double[]){__VA_ARGS__})))
589 
591 static inline void aa_fcpy( double *dst, const double *src, size_t n ) AA_DEPRECATED;
592 static inline void aa_fcpy( double *dst, const double *src, size_t n ) {
593  AA_MEM_CPY( dst, src, n );
594 }
595 
597 static inline void aa_fset( double *dst, double val, size_t n ) AA_DEPRECATED;
598 static inline void aa_fset( double *dst, double val, size_t n ) {
599  AA_MEM_SET( dst, val, n );
600 }
601 
603 static inline void aa_zero( void *p, size_t n ) AA_DEPRECATED;
604 static inline void aa_zero( void *p, size_t n ) {
605  memset(p,0,n);
606 }
607 
609 static inline void aa_fzero( double *p, size_t n ) AA_DEPRECATED;
610 static inline void aa_fzero( double *p, size_t n ) {
611  AA_MEM_SET( p, 0, n );
612 }
613 
615 #define AA_ZERO_AR( var ) aa_zero( var, sizeof(var) )
616 
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;
622 
623 
624 /**************/
625 /* Bit Array */
626 /**************/
627 
629 typedef int aa_bits;
630 
632 #define AA_BITS_BITS (8*sizeof(aa_bits))
633 
635 static inline size_t
636 aa_bits_words( size_t n )
637 {
638  size_t words = n / AA_BITS_BITS;
639  if( words*sizeof(aa_bits)*8 < n ) words++;
640  return words;
641 }
642 
644 static inline size_t
645 aa_bits_size( size_t n_bits )
646 {
647  return aa_bits_words(n_bits) * sizeof(aa_bits);
648 }
649 
650 #define AA_BITS_JK( i, j, k ) \
651  j = (i) / AA_BITS_BITS; \
652  k = (i) - (j)*AA_BITS_BITS;
653 
657 static inline int
658 aa_bits_get( aa_bits *b, size_t i )
659 {
660  size_t j,k;
661  AA_BITS_JK(i,j,k);
662 
663  return (b[j] >> k) & 0x1;
664 }
665 
666 
672 static inline int
673 aa_bits_getn( aa_bits *b, size_t n, size_t i )
674 {
675  if( aa_bits_size(i+1) > n ) return 0;
676  else return aa_bits_get( b, i );
677 }
678 
682 static inline void
683 aa_bits_set( aa_bits *b, size_t i, int val )
684 {
685  size_t j,k;
686  AA_BITS_JK(i,j,k);
687  if( val ) {
688  b[j] |= 0x1<<k;
689  } else {
690  b[j] &= ~ ( 0x1<<k );
691  }
692 }
693 
697 static inline void
698 aa_bits_and( aa_bits *a, const aa_bits *b, size_t n_bits )
699 {
700  size_t n_words = aa_bits_words(n_bits);
701  while( n_words ) {
702  a[n_words] &= b[n_words];
703  }
704 }
705 
709 static inline void
710 aa_bits_or( aa_bits *a, const aa_bits *b, size_t n_bits )
711 {
712  size_t n_words = aa_bits_words(n_bits);
713  while( n_words ) {
714  a[n_words] |= b[n_words];
715  }
716 }
717 
721 static inline void
722 aa_bits_xor( aa_bits *a, const aa_bits *b, size_t n_bits )
723 {
724  size_t n_words = aa_bits_words(n_bits);
725  while( n_words ) {
726  a[n_words] ^= b[n_words];
727  }
728 }
729 
730 
731 /************/
732 /* Swapping */
733 /************/
734 
738 typedef long aa_memswap_type;
739 
741 static inline void aa_memswap( void *AA_RESTRICT a, void *AA_RESTRICT b, size_t size )
742 {
743 
744  // TODO: consider alignment
745  aa_memswap_type *la = (aa_memswap_type*)a, *lb = (aa_memswap_type*)b;
746  for( size_t i = 0; i < size/sizeof(*la); i++ ) {
747  aa_memswap_type tmp = la[i];
748  la[i] = lb[i];
749  lb[i] = tmp;
750  }
751 
752  uint8_t *ca = (uint8_t*)a, *cb = (uint8_t*)b;
753  for( size_t i = size - size%sizeof(*la); i < size; i ++ ) {
754  uint8_t tmp = ca[i];
755  ca[i] = cb[i];
756  cb[i] = tmp;
757  }
758 
759 }
760 
762 #define AA_MEM_SWAP( a, b, n_elem ) (aa_memswap( (a), (b), n_elem*sizeof(*(a)) ))
763 
764 /***********/
765 /* VECTORS */
766 /***********/
767 
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); \
784  } \
785  ptr[(size)++] = (value);
786 
787 #define AA_VECTOR_DEF( element_type, vector_type ) \
788  typedef struct { \
789  size_t max; \
790  size_t size; \
791  element_type *data; \
792  } vector_type; \
793  static inline void vector_type ## _init \
794  ( vector_type *vec, size_t max ) { \
795  vec->data = (element_type*)malloc(max*sizeof(*vec->data)); \
796  vec->max = max; \
797  vec->size = (size_t)0; \
798  } \
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); \
802  }
803 
804 
805 
806 #endif //AA_MEM_H
#define AA_API
calling and name mangling convention for functions
Definition: amino.h:95
#define AA_RESTRICT
Defined restrict keyword based on language flavor.
Definition: amino.h:99
AA_EXTERN const char *aa_verbf_prefix AA_DEPRECATED
don't use
Definition: debug.h:104
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
Definition: mem.h:592
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.
Definition: mem.h:85
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.
Definition: mem.h:629
#define AA_ALLOC_STACK_MAX
maximum size of objects to stack allocate
Definition: mem.h:53
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
Definition: mem.h:598
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.
Definition: mem.h:523
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.
Definition: mem.h:632
static void * aa_malloc0(size_t size)
Malloc and zero initialize size bytes.
Definition: mem.h:77
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.
Definition: mem.h:645
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.
Definition: mem.h:738
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
Definition: mem.h:604
static size_t aa_bits_words(size_t n)
Number of aa_bits words to store n bits.
Definition: mem.h:636
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.
Definition: mem.h:710
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.
Definition: mem.h:698
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.
Definition: mem.h:140
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.
Definition: mem.h:106
static int aa_bits_get(aa_bits *b, size_t i)
Return the value of the i'th bit in bitset b.
Definition: mem.h:658
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.
Definition: mem.h:582
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.
Definition: mem.h:722
#define AA_MEM_SET(dst, val, n_elem)
Set n_elem elements at dst to val.
Definition: mem.h:566
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
Definition: mem.h:610
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.
Definition: mem.h:673
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.
Definition: mem.h:683
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.
Definition: mem.h:741
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.
Definition: mem.h:531
Circular buffers use a fixed-size array that acts as if connected end-to end.
Definition: mem.h:420
size_t start
start of filled data
Definition: mem.h:423
void * buf
memory
Definition: mem.h:421
size_t n
size of the circbuf
Definition: mem.h:422
size_t end
end of filled data
Definition: mem.h:424
A buffer struct.
Definition: mem.h:148
size_t n
size of buffer
Definition: mem.h:149
uint64_t dalign
dummy element for alignment
Definition: mem.h:151
A "cons" cell.
Definition: mem.h:451
struct aa_mem_cons * next
pointer to next list cell
Definition: mem.h:453
void * data
pointer to data
Definition: mem.h:452
Data Structure for Object pools.
Definition: mem.h:399
size_t size
size of each element
Definition: mem.h:400
aa_mem_region_t region
memory region to allocate from
Definition: mem.h:402
void * top
top of list of free elements
Definition: mem.h:401
A single block of memory to be parceled out by the region allocator.
Definition: mem.h:170
uint8_t d[]
data array
Definition: mem.h:174
uint8_t * end
pointer to end of this chunk
Definition: mem.h:172
struct aa_mem_region_node * next
pointer to next chunk node
Definition: mem.h:173
Data Structure for Region-Based memory allocation.
Definition: mem.h:199
unsigned free_on_destroy
Free struct when calling aa_mem_region_destroy().
Definition: mem.h:214
uint8_t * head
pointer to first free element of top chunk
Definition: mem.h:200
struct aa_mem_region_node * node
linked list of chunks
Definition: mem.h:201
int reserved
Reserve space for other bits.
Definition: mem.h:206
A linked list allocated out of a memory region.
Definition: mem.h:462