diff --git a/src/block_allocator.c b/src/block_allocator.c index 56a45a184bc7c566472d8dbe27ed145d1275f37c..ddc2b5c96e07c4942516ba6938c4a9cbe541bdca 100644 --- a/src/block_allocator.c +++ b/src/block_allocator.c @@ -50,6 +50,9 @@ static struct ba_page * ba_alloc_page(struct block_allocator * a, int i) { 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; } @@ -63,6 +66,9 @@ PMOD_EXPORT void ba_init(struct block_allocator * a, unsigned INT32 block_size, 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) { @@ -121,6 +127,11 @@ static void ba_low_alloc(struct block_allocator * a) { } } +#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]; @@ -132,16 +143,29 @@ PMOD_EXPORT void * ba_alloc(struct block_allocator * a) { } 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; } @@ -201,4 +225,7 @@ ERR: Pike_fatal("ptr %p not in any page.\n", ptr); } #endif +#ifdef HAVE_VALGRIND_MACROS + VALGRIND_MEMPOOL_FREE(a, ptr); +#endif }