Exemple #1
0
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);

}
Exemple #2
0
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;
}
Exemple #3
0
// 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()));
}