void __mhandle_check(char *at) { int i, count = 0; /* check for corruption in all allocated blocks */ for (i = 0; i < ht_size; i++) { if (ht[i].active && !ht[i].removed) { check_corruption(ht[i].ptr, ht[i].size, ht[i].at); count++; } } fprintf(stderr, "libmhandle: %d pointers checked for corruption\n", count); }
static unsigned long ht_remove(void *ptr, char *at) { int idx; /* find position */ idx = (unsigned long) ptr % ht_size; while (ht[idx].ptr != ptr || !ht[idx].active || ht[idx].removed) { if (!ht[idx].active) { fprintf(stderr, "\n%s: free: invalid pointer %p\n", at, ptr); abort(); } idx = (idx + 1) % ht_size; } /* check corruption */ check_corruption(ptr, ht[idx].size, at); /* remove item */ ht[idx].removed = 1; mem_busy -= ht[idx].size; ht_count--; return ht[idx].size; }
// physical address void wbtl_file::_add_free_region(offset_type offset, offset_type size) { // mapping_lock has to be aquired by caller STXXL_VERBOSE_WBTL("wbtl:addfre p" << FMT_A_S(offset, size) << " F <= f" << FMT_A_C(free_bytes, free_space.size())); offset_type region_pos = offset; offset_type region_size = size; if (!free_space.empty()) { sortseq::iterator succ = free_space.upper_bound(region_pos); sortseq::iterator pred = succ; pred--; check_corruption(region_pos, region_size, pred, succ); if (succ == free_space.end()) { if (pred == free_space.end()) { //dump(); assert(pred != free_space.end()); } if ((*pred).first + (*pred).second == region_pos) { // coalesce with predecessor region_size += (*pred).second; region_pos = (*pred).first; free_space.erase(pred); } } else { if (free_space.size() > 1) { bool succ_is_not_the_first = (succ != free_space.begin()); if ((*succ).first == region_pos + region_size) { // coalesce with successor region_size += (*succ).second; free_space.erase(succ); } if (succ_is_not_the_first) { if (pred == free_space.end()) { //dump(); assert(pred != free_space.end()); } if ((*pred).first + (*pred).second == region_pos) { // coalesce with predecessor region_size += (*pred).second; region_pos = (*pred).first; free_space.erase(pred); } } } else { if ((*succ).first == region_pos + region_size) { // coalesce with successor region_size += (*succ).second; free_space.erase(succ); } } } } free_space[region_pos] = region_size; free_bytes += size; STXXL_VERBOSE_WBTL("wbtl:free p" << FMT_A_S(region_pos, region_size) << " F => f" << FMT_A_C(free_bytes, free_space.size())); }