29 void disk_allocator::dump()
const
32 sortseq::const_iterator cur = free_space.begin();
34 for ( ; cur != free_space.end(); ++cur)
36 STXXL_ERRMSG(
"Free chunk: begin: " << (cur->first) <<
" size: " << (cur->second));
43 void disk_allocator::deallocation_error(
45 const sortseq::iterator& pred,
const sortseq::iterator& succ)
const
47 STXXL_ERRMSG(
"Error deallocating block at " << block_pos <<
" size " << block_size);
48 STXXL_ERRMSG(((pred == succ) ?
"pred==succ" :
"pred!=succ"));
49 if (pred == free_space.end()) {
52 if (pred == free_space.begin())
54 STXXL_ERRMSG(
"pred: begin=" << pred->first <<
" size=" << pred->second);
56 if (succ == free_space.end()) {
59 if (succ == free_space.begin())
61 STXXL_ERRMSG(
"succ: begin=" << succ->first <<
" size=" << succ->second);
71 STXXL_VERBOSE2(
"Deallocating a block with size: " << block_size <<
" position: " << block_pos);
74 if (!free_space.empty())
76 sortseq::iterator succ = free_space.upper_bound(region_pos);
77 sortseq::iterator pred = succ;
78 if (pred != free_space.begin())
80 if (pred != free_space.end())
82 if (pred->first <= region_pos && pred->first + pred->second > region_pos)
84 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 <<
"]");
87 if (succ != free_space.end())
89 if (region_pos <= succ->first && region_pos + region_size > succ->first)
91 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 <<
"]");
94 if (succ == free_space.end())
96 if (pred == free_space.end())
98 deallocation_error(block_pos, block_size, pred, succ);
99 assert(pred != free_space.end());
101 if ((*pred).first + (*pred).second == region_pos)
104 region_size += (*pred).second;
105 region_pos = (*pred).first;
106 free_space.erase(pred);
111 if (free_space.size() > 1)
116 deallocation_error(block_pos, block_size, pred, succ);
117 assert(pred != succ);
120 bool succ_is_not_the_first = (succ != free_space.begin());
121 if ((*succ).first == region_pos + region_size)
124 region_size += (*succ).second;
125 free_space.erase(succ);
129 if (succ_is_not_the_first)
131 if (pred == free_space.end())
133 deallocation_error(block_pos, block_size, pred, succ);
134 assert(pred != free_space.end());
136 if ((*pred).first + (*pred).second == region_pos)
139 region_size += (*pred).second;
140 region_pos = (*pred).first;
141 free_space.erase(pred);
147 if ((*succ).first == region_pos + region_size)
150 region_size += (*succ).second;
151 free_space.erase(succ);
157 free_space[region_pos] = region_size;
158 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