Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/malloc.c

    r207533f re6eee2b  
    7979        (sizeof(heap_block_head_t) + sizeof(heap_block_foot_t))
    8080
    81 /** Overhead of each area. */
    82 #define AREA_OVERHEAD(size) \
    83         (ALIGN_UP(size + sizeof(heap_area_t), BASE_ALIGN))
    84 
    8581/** Calculate real size of a heap block.
    8682 *
     
    187183
    188184/** Next heap block to examine (next fit algorithm) */
    189 static heap_block_head_t *next_fit = NULL;
     185static heap_block_head_t *next = NULL;
    190186
    191187/** Futex for thread-safe heap manipulation */
    192188static futex_t malloc_futex = FUTEX_INITIALIZER;
    193 
    194 #ifndef NDEBUG
    195 
    196 #define malloc_assert(expr) \
    197         do { \
    198                 if (!(expr)) {\
    199                         futex_up(&malloc_futex); \
    200                         assert_abort(#expr, __FILE__, __LINE__); \
    201                 } \
    202         } while (0)
    203 
    204 #else /* NDEBUG */
    205 
    206 #define malloc_assert(expr)
    207 
    208 #endif /* NDEBUG */
    209189
    210190/** Initialize a heap block
     
    248228        heap_block_head_t *head = (heap_block_head_t *) addr;
    249229       
    250         malloc_assert(head->magic == HEAP_BLOCK_HEAD_MAGIC);
     230        assert(head->magic == HEAP_BLOCK_HEAD_MAGIC);
    251231       
    252232        heap_block_foot_t *foot = BLOCK_FOOT(head);
    253233       
    254         malloc_assert(foot->magic == HEAP_BLOCK_FOOT_MAGIC);
    255         malloc_assert(head->size == foot->size);
     234        assert(foot->magic == HEAP_BLOCK_FOOT_MAGIC);
     235        assert(head->size == foot->size);
    256236}
    257237
     
    267247        heap_area_t *area = (heap_area_t *) addr;
    268248       
    269         malloc_assert(area->magic == HEAP_AREA_MAGIC);
    270         malloc_assert(addr == area->start);
    271         malloc_assert(area->start < area->end);
    272         malloc_assert(((uintptr_t) area->start % PAGE_SIZE) == 0);
    273         malloc_assert(((uintptr_t) area->end % PAGE_SIZE) == 0);
     249        assert(area->magic == HEAP_AREA_MAGIC);
     250        assert(addr == area->start);
     251        assert(area->start < area->end);
     252        assert(((uintptr_t) area->start % PAGE_SIZE) == 0);
     253        assert(((uintptr_t) area->end % PAGE_SIZE) == 0);
    274254}
    275255
     
    382362       
    383363        /* Eventually try to create a new area */
    384         return area_create(AREA_OVERHEAD(size));
     364        return area_create(AREA_FIRST_BLOCK_HEAD(size));
    385365}
    386366
     
    402382       
    403383        block_check((void *) last_head);
    404         malloc_assert(last_head->area == area);
     384        assert(last_head->area == area);
    405385       
    406386        if (last_head->free) {
     
    415395               
    416396                block_check((void *) first_head);
    417                 malloc_assert(first_head->area == area);
     397                assert(first_head->area == area);
    418398               
    419399                size_t shrink_size = ALIGN_DOWN(last_head->size, PAGE_SIZE);
     
    459439                        /* Update heap area parameters */
    460440                        area->end = end;
    461                         size_t excess = ((size_t) area->end) - ((size_t) last_head);
     441                       
     442                        /* Update block layout */
     443                        void *last = (void *) last_head;
     444                        size_t excess = (size_t) (area->end - last);
    462445                       
    463446                        if (excess > 0) {
     
    468451                                         * create a new free block.
    469452                                         */
    470                                         block_init((void *) last_head, excess, true, area);
     453                                        block_init(last, excess, true, area);
    471454                                } else {
    472455                                        /*
     
    487470        }
    488471       
    489         next_fit = NULL;
     472        next = NULL;
    490473}
    491474
     
    514497static void split_mark(heap_block_head_t *cur, const size_t size)
    515498{
    516         malloc_assert(cur->size >= size);
     499        assert(cur->size >= size);
    517500       
    518501        /* See if we should split the block. */
     
    550533{
    551534        area_check((void *) area);
    552         malloc_assert((void *) first_block >= (void *) AREA_FIRST_BLOCK_HEAD(area));
    553         malloc_assert((void *) first_block < area->end);
     535        assert((void *) first_block >= (void *) AREA_FIRST_BLOCK_HEAD(area));
     536        assert((void *) first_block < area->end);
    554537       
    555538        for (heap_block_head_t *cur = first_block; (void *) cur < area->end;
     
    576559                                split_mark(cur, real_size);
    577560                               
    578                                 next_fit = cur;
     561                                next = cur;
    579562                                return addr;
    580563                        } else {
     
    628611                                                split_mark(next_head, real_size);
    629612                                               
    630                                                 next_fit = next_head;
     613                                                next = next_head;
    631614                                                return aligned;
    632615                                        } else {
     
    654637                                                        split_mark(cur, real_size);
    655638                                                       
    656                                                         next_fit = cur;
     639                                                        next = cur;
    657640                                                        return aligned;
    658641                                                }
     
    678661static void *malloc_internal(const size_t size, const size_t align)
    679662{
    680         malloc_assert(first_heap_area != NULL);
     663        assert(first_heap_area != NULL);
    681664       
    682665        if (align == 0)
     
    692675       
    693676        /* Try the next fit approach */
    694         split = next_fit;
     677        split = next;
    695678       
    696679        if (split != NULL) {
     
    803786       
    804787        block_check(head);
    805         malloc_assert(!head->free);
     788        assert(!head->free);
    806789       
    807790        heap_area_t *area = head->area;
    808791       
    809792        area_check(area);
    810         malloc_assert((void *) head >= (void *) AREA_FIRST_BLOCK_HEAD(area));
    811         malloc_assert((void *) head < area->end);
     793        assert((void *) head >= (void *) AREA_FIRST_BLOCK_HEAD(area));
     794        assert((void *) head < area->end);
    812795       
    813796        void *ptr = NULL;
     
    848831                       
    849832                        ptr = ((void *) head) + sizeof(heap_block_head_t);
    850                         next_fit = NULL;
     833                        next = NULL;
    851834                } else
    852835                        reloc = true;
     
    880863       
    881864        block_check(head);
    882         malloc_assert(!head->free);
     865        assert(!head->free);
    883866       
    884867        heap_area_t *area = head->area;
    885868       
    886869        area_check(area);
    887         malloc_assert((void *) head >= (void *) AREA_FIRST_BLOCK_HEAD(area));
    888         malloc_assert((void *) head < area->end);
     870        assert((void *) head >= (void *) AREA_FIRST_BLOCK_HEAD(area));
     871        assert((void *) head < area->end);
    889872       
    890873        /* Mark the block itself as free. */
     
    921904}
    922905
    923 void *heap_check(void)
    924 {
    925         futex_down(&malloc_futex);
    926        
    927         if (first_heap_area == NULL) {
    928                 futex_up(&malloc_futex);
    929                 return (void *) -1;
    930         }
    931        
    932         /* Walk all heap areas */
    933         for (heap_area_t *area = first_heap_area; area != NULL;
    934             area = area->next) {
    935                
    936                 /* Check heap area consistency */
    937                 if ((area->magic != HEAP_AREA_MAGIC) ||
    938                     ((void *) area != area->start) ||
    939                     (area->start >= area->end) ||
    940                     (((uintptr_t) area->start % PAGE_SIZE) != 0) ||
    941                     (((uintptr_t) area->end % PAGE_SIZE) != 0)) {
    942                         futex_up(&malloc_futex);
    943                         return (void *) area;
    944                 }
    945                
    946                 /* Walk all heap blocks */
    947                 for (heap_block_head_t *head = (heap_block_head_t *)
    948                     AREA_FIRST_BLOCK_HEAD(area); (void *) head < area->end;
    949                     head = (heap_block_head_t *) (((void *) head) + head->size)) {
    950                        
    951                         /* Check heap block consistency */
    952                         if (head->magic != HEAP_BLOCK_HEAD_MAGIC) {
    953                                 futex_up(&malloc_futex);
    954                                 return (void *) head;
    955                         }
    956                        
    957                         heap_block_foot_t *foot = BLOCK_FOOT(head);
    958                        
    959                         if ((foot->magic != HEAP_BLOCK_FOOT_MAGIC) ||
    960                             (head->size != foot->size)) {
    961                                 futex_up(&malloc_futex);
    962                                 return (void *) foot;
    963                         }
    964                 }
    965         }
    966        
    967         futex_up(&malloc_futex);
    968        
    969         return NULL;
    970 }
    971 
    972906/** @}
    973907 */
Note: See TracChangeset for help on using the changeset viewer.