Branch: Tag:

2014-12-04

2014-12-04 19:24:11 by Arne Goedeke <el@laramies.com>

block_allocator: fixed ba_walk and some cleanup

354:    size_t length;    bv_int_t * v;   }; - #ifdef BA_DEBUG - static INLINE void bv_print(struct bitvector * bv) { -  size_t i; -  for (i = 0; i < bv->length; i++) { -  fprintf(stderr, "%d", bv_get(bv, i)); -  } -  fprintf(stderr, "\n"); - } - #endif +       static INLINE void bv_set_vector(struct bitvector * bv, void * p) {    bv->v = (bv_int_t*)p;
396:    bv_int_t * _v = bv->v + c;    bv_int_t V = *_v & (~BV_NIL << bit);    - #ifdef BA_DEBUG -  //bv_print(bv); - #endif -  +     bit = c * BV_LENGTH;    while (!(V)) {    if (bit >= bv->length) {
416:    return bit;   }    + #ifdef BA_DEBUG + static INLINE void bv_print(struct bitvector * bv) { +  size_t i; +  for (i = 0; i < bv->length; i++) { +  fprintf(stderr, "%d", bv_get(bv, i)); +  } +  fprintf(stderr, "\n"); + } + #endif +    struct ba_block_header * ba_sort_list(const struct ba_page * p,    struct ba_block_header * b,    const struct ba_layout * l) {
423:    size_t i, j;    struct ba_block_header ** t = &b;    - #ifdef BA_DEBUG -  fprintf(stderr, "sorting max %llu blocks\n", -  (unsigned long long)l->blocks); - #endif +     v.length = l->blocks;    i = bv_byte_length(&v);    /* we should probably reuse an area for this.
439:    */    while (b) {    unsigned INT32 n = ba_block_number(l, p, b); - #ifdef BA_DEBUG -  //fprintf(stderr, "block %llu is free\n", (long long unsigned)n); - #endif +     bv_set(&v, n, 1);    if (b->next == BA_ONE) {    v.length = n+1;
449:    } else b = b->next;    }    - #ifdef BA_DEBUG -  //bv_print(&v); - #endif -  +     /*    * Handle consecutive free blocks in the end, those    * we dont need anyway.
463:    v.length = i+1;    }    - #ifdef BA_DEBUG -  //bv_print(&v); - #endif -  +     j = 0;       /*
527:    struct ba_iterator it;    unsigned INT32 i;    +  it.l = ba_get_layout(a, 0); +     if (!a->size) return;       for (i = 0; i < a->size; i++) {    struct ba_page * p = a->pages[i];    if (p && p->h.used) { -  struct ba_block_header * free_list = p->h.first; -  struct ba_block_header * free_block = free_list; +  struct ba_block_header * free_list, * free_block; +     ba_list_defined(a, p->h.first);    -  /* we fake an allocation to prevent the page from being freed during iteration */ -  p->h.used ++; -  +     if (!(p->h.flags & BA_FLAG_SORTED)) { -  it.l = ba_get_layout(a, i); +     p->h.first = ba_sort_list(p, p->h.first, &it.l);    p->h.flags |= BA_FLAG_SORTED;    } -  +  /* we fake an allocation to prevent the page from being freed during iteration */ +  p->h.used ++;    -  +  free_list = p->h.first; +  free_block = free_list; +     it.cur = BA_BLOCKN(it.l, p, 0);       while(1) {    if (free_block == NULL) {    it.end = ((char*)BA_LASTBLOCK(it.l, p) + it.l.block_size); -  if ((char*)it.end != (char*)it.cur) +  if ((char*)it.end != (char*)it.cur) {    cb(&it, data); -  +  }    break;    } else if (free_block == BA_ONE) {    /* all consecutive blocks are free, so we are dont */