void dm_free_aux(void *p) { char *ptr; size_t i; struct memblock *mb = ((struct memblock *) p) - 1; if (!p) return; dm_bounds_check(); /* sanity check */ assert(mb->magic == p); #ifdef VALGRIND_POOL VALGRIND_MAKE_MEM_DEFINED(p, mb->length); #endif /* check data at the far boundary */ ptr = (char *) p + mb->length; for (i = 0; i < sizeof(unsigned long); i++) if (ptr[i] != (char) mb->id) assert(!"Damage at far end of block"); /* have we freed this before ? */ assert(mb->id != 0); /* unlink */ if (mb->prev) mb->prev->next = mb->next; else _head = mb->next; if (mb->next) mb->next->prev = mb->prev; else _tail = mb->prev; mb->id = 0; /* stomp a different pattern across the memory */ ptr = p; for (i = 0; i < mb->length; i++) ptr[i] = i & 1 ? (char) 0xde : (char) 0xad; assert(_mem_stats.blocks_allocated); _mem_stats.blocks_allocated--; _mem_stats.bytes -= mb->length; /* free the memory */ free(mb); }
void *dm_malloc_aux_debug(size_t s, const char *file, int line) { struct memblock *nb; size_t tsize = s + sizeof(*nb) + sizeof(unsigned long); if (s > 50000000) { log_error("Huge memory allocation (size %" PRIsize_t ") rejected - metadata corruption?", s); return 0; } if (!(nb = malloc(tsize))) { log_error("couldn't allocate any memory, size = %" PRIsize_t, s); return 0; } /* set up the file and line info */ nb->file = file; nb->line = line; dm_bounds_check(); /* setup fields */ nb->magic = nb + 1; nb->length = s; nb->id = ++_mem_stats.block_serialno; nb->next = 0; /* stomp a pretty pattern across the new memory and fill in the boundary bytes */ { char *ptr = (char *) (nb + 1); size_t i; for (i = 0; i < s; i++) *ptr++ = i & 0x1 ? (char) 0xba : (char) 0xbe; for (i = 0; i < sizeof(unsigned long); i++) *ptr++ = (char) nb->id; } nb->prev = _tail; /* link to tail of the list */ if (!_head) _head = _tail = nb; else { _tail->next = nb; _tail = nb; } _mem_stats.blocks_allocated++; if (_mem_stats.blocks_allocated > _mem_stats.blocks_max) _mem_stats.blocks_max = _mem_stats.blocks_allocated; _mem_stats.bytes += s; if (_mem_stats.bytes > _mem_stats.mbytes) _mem_stats.mbytes = _mem_stats.bytes; /* log_debug("Allocated: %u %u %u", nb->id, _mem_stats.blocks_allocated, _mem_stats.bytes); */ return nb + 1; }