28 void disk_allocator::dump()
const
31 sortseq::const_iterator cur = free_space.begin();
33 for ( ; cur != free_space.end(); ++cur)
35 STXXL_ERRMSG(
"Free chunk: begin: " << (cur->first) <<
" size: " << (cur->second));
41 void disk_allocator::deallocation_error(
43 const sortseq::iterator& pred,
const sortseq::iterator& succ)
const
45 STXXL_ERRMSG(
"Error deallocating block at " << block_pos <<
" size " << block_size);
46 STXXL_ERRMSG(((pred == succ) ?
"pred==succ" :
"pred!=succ"));
47 if (pred == free_space.end()) {
51 if (pred == free_space.begin())
53 STXXL_ERRMSG(
"pred: begin=" << pred->first <<
" size=" << pred->second);
55 if (succ == free_space.end()) {
59 if (succ == free_space.begin())
61 STXXL_ERRMSG(
"succ: begin=" << succ->first <<
" size=" << succ->second);
70 STXXL_VERBOSE2(
"Deallocating a block with size: " << block_size <<
" position: " << block_pos);
73 if (!free_space.empty())
75 sortseq::iterator succ = free_space.upper_bound(region_pos);
76 sortseq::iterator pred = succ;
77 if (pred != free_space.begin())
79 if (pred != free_space.end())
81 if (pred->first <= region_pos && pred->first + pred->second > region_pos)
83 STXXL_THROW2(
bad_ext_alloc,
"disk_allocator::check_corruption",
"Error: double deallocation of external memory, trying to deallocate region " << region_pos <<
" + " << region_size <<
" in empty space [" << pred->first <<
" + " << pred->second <<
"]");
86 if (succ != free_space.end())
88 if (region_pos <= succ->first && region_pos + region_size > succ->first)
90 STXXL_THROW2(
bad_ext_alloc,
"disk_allocator::check_corruption",
"Error: double deallocation of external memory, trying to deallocate region " << region_pos <<
" + " << region_size <<
" which overlaps empty space [" << succ->first <<
" + " << succ->second <<
"]");
93 if (succ == free_space.end())
95 if (pred == free_space.end())
97 deallocation_error(block_pos, block_size, pred, succ);
98 assert(pred != free_space.end());
100 if ((*pred).first + (*pred).second == region_pos)
103 region_size += (*pred).second;
104 region_pos = (*pred).first;
105 free_space.erase(pred);
110 if (free_space.size() > 1)
115 deallocation_error(block_pos, block_size, pred, succ);
116 assert(pred != succ);
119 bool succ_is_not_the_first = (succ != free_space.begin());
120 if ((*succ).first == region_pos + region_size)
123 region_size += (*succ).second;
124 free_space.erase(succ);
128 if (succ_is_not_the_first)
130 if (pred == free_space.end())
132 deallocation_error(block_pos, block_size, pred, succ);
133 assert(pred != free_space.end());
135 if ((*pred).first + (*pred).second == region_pos)
138 region_size += (*pred).second;
139 region_pos = (*pred).first;
140 free_space.erase(pred);
146 if ((*succ).first == region_pos + region_size)
149 region_size += (*succ).second;
150 free_space.erase(succ);
156 free_space[region_pos] = region_size;
157 free_bytes += block_size;
#define STXXL_VERBOSE2(x)
#define STXXL_BEGIN_NAMESPACE
#define STXXL_THROW2(exception_type, location, error_message)
Throws exception_type with "Error in [location] : [error_message]".
#define STXXL_END_NAMESPACE