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()) {
50 if (pred == free_space.begin())
52 STXXL_ERRMSG(
"pred: begin=" << pred->first <<
" size=" << pred->second);
54 if (succ == free_space.end()) {
57 if (succ == free_space.begin())
59 STXXL_ERRMSG(
"succ: begin=" << succ->first <<
" size=" << succ->second);
68 STXXL_VERBOSE2(
"Deallocating a block with size: " << block_size <<
" position: " << block_pos);
71 if (!free_space.empty())
73 sortseq::iterator succ = free_space.upper_bound(region_pos);
74 sortseq::iterator pred = succ;
75 if (pred != free_space.begin())
77 if (pred != free_space.end())
79 if (pred->first <= region_pos && pred->first + pred->second > region_pos)
81 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 <<
"]");
84 if (succ != free_space.end())
86 if (region_pos <= succ->first && region_pos + region_size > succ->first)
88 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 <<
"]");
91 if (succ == free_space.end())
93 if (pred == free_space.end())
95 deallocation_error(block_pos, block_size, pred, succ);
96 assert(pred != free_space.end());
98 if ((*pred).first + (*pred).second == region_pos)
101 region_size += (*pred).second;
102 region_pos = (*pred).first;
103 free_space.erase(pred);
108 if (free_space.size() > 1)
113 deallocation_error(block_pos, block_size, pred, succ);
114 assert(pred != succ);
117 bool succ_is_not_the_first = (succ != free_space.begin());
118 if ((*succ).first == region_pos + region_size)
121 region_size += (*succ).second;
122 free_space.erase(succ);
126 if (succ_is_not_the_first)
128 if (pred == free_space.end())
130 deallocation_error(block_pos, block_size, pred, succ);
131 assert(pred != free_space.end());
133 if ((*pred).first + (*pred).second == region_pos)
136 region_size += (*pred).second;
137 region_pos = (*pred).first;
138 free_space.erase(pred);
144 if ((*succ).first == region_pos + region_size)
147 region_size += (*succ).second;
148 free_space.erase(succ);
154 free_space[region_pos] = region_size;
155 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