pike.git / src / block_allocator.c

version» Context lines:

pike.git/src/block_allocator.c:43:    struct ba_block_header * next;   };      static struct ba_page * ba_alloc_page(struct block_allocator * a, int i) {    struct ba_layout l = ba_get_layout(a, i);    size_t n = l.offset + l.block_size + sizeof(struct ba_page);    struct ba_page * p = (struct ba_page*)xalloc(n);    p->h.first = BA_BLOCKN(a->l, p, 0);    p->h.first->next = BA_ONE;    p->h.used = 0; + #ifdef HAVE_VALGRIND_MACROS +  VALGRIND_MAKE_MEM_NOACCESS(p+1, n - sizeof(struct ba_page)); + #endif    return p;   }      PMOD_EXPORT void ba_init(struct block_allocator * a, unsigned INT32 block_size, unsigned INT32 blocks) {    block_size = MAXIMUM(block_size, sizeof(struct ba_block_header));    blocks = round_up32(blocks);    a->alloc = a->last_free = 0;    a->size = 1;    a->l.block_size = block_size;    a->l.blocks = blocks;    a->l.offset = block_size * (blocks-1);    memset(a->pages, 0, sizeof(a->pages));    a->pages[0] = ba_alloc_page(a, 0); -  + #ifdef HAVE_VALGRIND_MACROS +  VALGRIND_CREATE_MEMPOOL(a, 0, 0); + #endif   }      PMOD_EXPORT void ba_destroy(struct block_allocator * a) {    int i;    for (i = 0; i < a->size; i++) {    if (a->pages[i]) {    free(a->pages[i]);    a->pages[i] = NULL;    }    }
pike.git/src/block_allocator.c:114:    Pike_error("Out of memory.");    }    a->pages[a->size] = ba_alloc_page(a, a->size);    a->alloc = a->size;    a->size++;    } else {    ba_init(a, a->l.block_size, a->l.blocks);    }   }    + #ifndef VALGRIND_MEMPOOL_ALLOC + # define VALGRIND_MEMPOOL_ALLOC(a, p, l) VALGRIND_MAKE_MEM_UNDEFINED((p), (l)) + # define VALGRIND_MEMPOOL_FREE(a, p) VALGRIND_MAKE_MEM_NOACCESS((p), (a)->l.block_size) + #endif +    ATTRIBUTE((malloc))   PMOD_EXPORT void * ba_alloc(struct block_allocator * a) {    struct ba_page * p = a->pages[a->alloc];    struct ba_block_header * ptr;       if (!p || !p->h.first) {    ba_low_alloc(a);    p = a->pages[a->alloc];    }       ptr = p->h.first; -  + #ifdef HAVE_VALGRIND_MACROS +  VALGRIND_MEMPOOL_ALLOC(a, ptr, a->l.block_size); +  VALGRIND_MAKE_MEM_DEFINED(ptr, sizeof(void*)); + #endif       p->h.used++;       if (ptr->next == BA_ONE) {    struct ba_layout l = ba_get_layout(a, a->alloc);    p->h.first = (struct ba_block_header*)((char*)ptr + a->l.block_size); -  + #ifdef HAVE_VALGRIND_MACROS +  VALGRIND_MEMPOOL_ALLOC(a, p->h.first, a->l.block_size); + #endif    p->h.first->next = (struct ba_block_header*)(ptrdiff_t)!(p->h.first == BA_LASTBLOCK(l, p)); -  + #ifdef HAVE_VALGRIND_MACROS +  VALGRIND_MEMPOOL_FREE(a, p->h.first); + #endif    } else {    p->h.first = ptr->next;    } -  + #ifdef HAVE_VALGRIND_MACROS +  VALGRIND_MAKE_MEM_UNDEFINED(ptr, sizeof(void*)); + #endif       return ptr;   }      PMOD_EXPORT void ba_free(struct block_allocator * a, void * ptr) {    int i = a->last_free;    struct ba_page * p = a->pages[i];    struct ba_layout l = ba_get_layout(a, i);       if (BA_CHECK_PTR(l, p, ptr)) goto found;
pike.git/src/block_allocator.c:194: Inside #if defined(PIKE_DEBUG)
  ERR:    for (i = a->size-1, l = ba_get_layout(a, i); i >= 0; ba_half_layout(&l), i--) {    p = a->pages[i];    fprintf(stderr, "page: %p used: %u/%u last: %p p+offset: %p\n", a->pages[i],    p->h.used, l.blocks,    BA_BLOCKN(l, p, l.blocks-1), BA_LASTBLOCK(l, p));    }    Pike_fatal("ptr %p not in any page.\n", ptr);    }   #endif + #ifdef HAVE_VALGRIND_MACROS +  VALGRIND_MEMPOOL_FREE(a, ptr); + #endif   }