Changeset 678


Ignore:
Timestamp:
Jul 29, 2015, 5:52:17 PM (9 years ago)
Author:
guerin
Message:

malloc: implement aligned malloc/free

Location:
soft/giet_vm/giet_libs
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/giet_libs/malloc.c

    r588 r678  
    431431} // end free()
    432432
    433 
    434 
     433//////////////////////
     434// reference: http://stackoverflow.com/a/6563989/4244300
     435void * almalloc( unsigned int align, unsigned int size )
     436{
     437    unsigned int total_size;
     438    void* ptr;
     439
     440    // check if align is a power of two
     441    if ( !align || (align & (align - 1)) )
     442        return NULL;
     443
     444    // reserve memory for data + offset + book-keeping
     445    total_size = size + align + sizeof(void*);
     446    ptr = malloc( total_size );
     447
     448    if ( ptr )
     449    {
     450        void* start = ptr;
     451        void** book;
     452
     453        // find aligned ptr
     454        ptr += sizeof(void*);
     455        ptr += align - ((unsigned int)ptr % align);
     456
     457        // keep original ptr just before the actual data
     458        book = ptr - sizeof(void*);
     459        *book = start;
     460    }
     461
     462    return ptr;
     463}
     464
     465//////////////////////
     466void alfree( void* ptr )
     467{
     468    if ( ptr )
     469    {
     470        void** book = ptr - sizeof(void*);
     471        free(*book);
     472    }
     473}
    435474
    436475// Local Variables:
  • soft/giet_vm/giet_libs/malloc.h

    r588 r678  
    101101extern void free(void * ptr);
    102102
     103extern void* almalloc (unsigned int align, unsigned int size );
     104
     105extern void alfree(void * ptr);
    103106
    104107#endif
Note: See TracChangeset for help on using the changeset viewer.