void memory_region::release_alloc(void *mem) { # if RUSTRT_TRACK_ALLOCATIONS >= 1 alloc_header *alloc = get_header(mem); assert(alloc->magic == MAGIC); # endif # if RUSTRT_TRACK_ALLOCATIONS >= 2 if (_synchronized) { _lock.lock(); } if (_allocation_list[alloc->index] != alloc) { printf("free: ptr 0x%" PRIxPTR " (%s) is not in allocation_list\n", (uintptr_t) get_data(alloc), alloc->tag); _srv->fatal("not in allocation_list", __FILE__, __LINE__, ""); } else { // printf("freed index %d\n", index); _allocation_list[alloc->index] = NULL; alloc->index = -1; } if (_synchronized) { _lock.unlock(); } # endif dec_alloc(); }
void memory_region::release_alloc(void *mem) { # if RUSTRT_TRACK_ALLOCATIONS >= 1 alloc_header *alloc = get_header(mem); assert(alloc->magic == MAGIC); # endif # if RUSTRT_TRACK_ALLOCATIONS >= 2 if (_synchronized) { _lock.lock(); } if (((size_t) alloc->index) >= _allocation_list.size()) { printf("free: ptr 0x%" PRIxPTR " (%s) index %d is beyond allocation_list of size %zu\n", (uintptr_t) get_data(alloc), alloc->tag, alloc->index, _allocation_list.size()); maybe_print_backtrace(alloc); assert(false && "index beyond allocation_list"); } if (_allocation_list[alloc->index] != alloc) { printf("free: ptr 0x%" PRIxPTR " (%s) is not in allocation_list\n", (uintptr_t) get_data(alloc), alloc->tag); maybe_print_backtrace(alloc); assert(false && "not in allocation_list"); } else { // printf("freed index %d\n", index); _allocation_list[alloc->index] = NULL; alloc->index = -1; } if (_synchronized) { _lock.unlock(); } # endif dec_alloc(); }
void memory_region::free(void *mem) { // printf("free: ptr 0x%" PRIxPTR" region=%p\n", (uintptr_t) mem, this); if (!mem) { return; } if (_synchronized) { _lock.lock(); } alloc_header *alloc = get_header(mem); assert(alloc->magic == MAGIC); #ifdef TRACK_ALLOCATIONS if (_allocation_list[alloc->index] != alloc) { printf("free: ptr 0x%" PRIxPTR " is not in allocation_list\n", (uintptr_t) mem); _srv->fatal("not in allocation_list", __FILE__, __LINE__, ""); } else { // printf("freed index %d\n", index); _allocation_list[alloc->index] = NULL; } #endif if (_live_allocations < 1) { _srv->fatal("live_allocs < 1", __FILE__, __LINE__, ""); } dec_alloc(); _srv->free(alloc); if (_synchronized) { _lock.unlock(); } }
void memory_region::free(void *mem) { // printf("free: ptr 0x%" PRIxPTR" region=%p\n", (uintptr_t) mem, this); if (!mem) { return; } if (_synchronized) { _lock.lock(); } #ifdef TRACK_ALLOCATIONS int index = ((int *)mem)[-1]; if (_allocation_list[index] != (uint8_t *)mem - sizeof(int)) { printf("free: ptr 0x%" PRIxPTR " is not in allocation_list\n", (uintptr_t) mem); _srv->fatal("not in allocation_list", __FILE__, __LINE__, ""); } else { // printf("freed index %d\n", index); _allocation_list[index] = NULL; } mem = (void*)((uint8_t*)mem - sizeof(int)); #endif if (_live_allocations < 1) { _srv->fatal("live_allocs < 1", __FILE__, __LINE__, ""); } dec_alloc(); _srv->free(mem); if (_synchronized) { _lock.unlock(); } }