Branch: Tag:

2014-09-05

2014-09-05 10:12:52 by Arne Goedeke <el@laramies.com>

block_allocator: do not keep empty pages around

In certain cases the block allocator kept around free pages. This
happened with markers used by the gc.

95:   }      static void ba_free_empty_pages(struct block_allocator * a) { -  int i = a->size - 1; +  int i;       for (i = a->size - 1; i >= 0; i--) {    struct ba_page * p = a->pages[i];
108:    a->pages[i] = NULL;    }    +  if (a->size != i+1) {    a->size = i+1;    a->alloc = a->last_free = MAXIMUM(0, i);    } -  + }      PMOD_EXPORT void ba_low_init_aligned(struct block_allocator * a) {    unsigned INT32 block_size = MAXIMUM(a->l.block_size, sizeof(struct ba_block_header));
164:      PMOD_EXPORT void ba_free_all(struct block_allocator * a) {    int i; -  struct ba_layout l; +        if (!a->l.offset) return;    if (!a->size) return;    -  l = ba_get_layout(a, 0); -  +     for (i = 0; i < a->size; i++) { -  struct ba_page * page = a->pages[i]; -  ba_clear_page(a, page, &l); -  ba_double_layout(&l); +  free(a->pages[i]); +  a->pages[i] = NULL;    } -  +  a->size = 0;    a->alloc = 0;    a->last_free = 0;   }