13 #ifndef STXXL_WRITE_POOL_HEADER
14 #define STXXL_WRITE_POOL_HEADER
18 #ifdef STXXL_BOOST_CONFIG
19 #include <boost/config.hpp>
22 #include <stxxl/bits/mng/mng.h>
26 __STXXL_BEGIN_NAMESPACE
33 template <
class BlockType>
37 typedef BlockType block_type;
38 typedef typename block_type::bid_type bid_type;
47 busy_entry() : block(NULL) { }
48 busy_entry(
const busy_entry & a) : block(a.block), req(a.req), bid(a.bid) { }
49 busy_entry(block_type * & bl,
request_ptr & r, bid_type & bi) :
50 block(bl), req(r), bid(bi) { }
56 typedef typename std::list<block_type *>::iterator free_blocks_iterator;
57 typedef typename std::list<busy_entry>::iterator busy_blocks_iterator;
61 std::list<block_type *> free_blocks;
63 std::list<busy_entry> busy_blocks;
67 unsigned_type free_blocks_size, busy_blocks_size;
72 explicit write_pool(unsigned_type init_size = 1) : free_blocks_size(init_size), busy_blocks_size(0)
75 for ( ; i < init_size; ++i)
76 free_blocks.push_back(
new block_type);
81 std::swap(free_blocks, obj.free_blocks);
82 std::swap(busy_blocks, obj.busy_blocks);
83 std::swap(free_blocks_size, obj.free_blocks_size);
84 std::swap(busy_blocks_size, busy_blocks_size);
90 STXXL_VERBOSE2(
"write_pool::~write_pool free_blocks_size: " <<
91 free_blocks_size <<
" busy_blocks_size: " << busy_blocks_size);
92 while (!free_blocks.empty())
94 delete free_blocks.back();
95 free_blocks.pop_back();
100 for (busy_blocks_iterator i2 = busy_blocks.begin(); i2 != busy_blocks.end(); ++i2)
111 unsigned_type
size()
const {
return free_blocks_size + busy_blocks_size; }
121 for (busy_blocks_iterator i2 = busy_blocks.begin(); i2 != busy_blocks.end(); ++i2)
123 if (i2->bid == bid && i2->block != block) {
124 STXXL_VERBOSE1(
"WAW dependency");
129 busy_blocks.push_back(busy_entry(block, result, bid));
138 if (free_blocks_size)
140 STXXL_VERBOSE1(
"write_pool::steal : " << free_blocks_size <<
" free blocks available");
142 block_type * p = free_blocks.back();
143 free_blocks.pop_back();
146 STXXL_VERBOSE1(
"write_pool::steal : all " << busy_blocks_size <<
" are busy");
147 busy_blocks_iterator completed =
wait_any(busy_blocks.begin(), busy_blocks.end());
148 assert(completed != busy_blocks.end());
149 assert(completed->req->poll());
150 block_type * p = completed->block;
151 busy_blocks.erase(completed);
158 __STXXL_DEPRECATED(block_type *
get())
165 void resize(unsigned_type new_size)
167 int_type diff = int_type(new_size) - int_type(
size());
170 free_blocks_size += diff;
172 free_blocks.push_back(
new block_type);
184 busy_blocks_iterator i2 = busy_blocks.begin();
185 for ( ; i2 != busy_blocks.end(); ++i2)
194 block_type *
steal(bid_type bid)
196 busy_blocks_iterator i2 = busy_blocks.begin();
197 for ( ; i2 != busy_blocks.end(); ++i2)
201 block_type * p = i2->block;
203 busy_blocks.erase(i2);
211 void add(block_type * block)
213 free_blocks.push_back(block);
218 void check_all_busy()
220 busy_blocks_iterator cur = busy_blocks.begin();
222 #if STXXL_VERBOSE_LEVEL > 0
223 int_type busy_blocks_size_old = busy_blocks_size;
225 for ( ; cur != busy_blocks.end(); ++cur)
227 if (cur->req->poll())
229 free_blocks.push_back(cur->block);
230 busy_blocks.erase(cur);
231 cur = busy_blocks.begin();
235 if (busy_blocks.empty())
239 STXXL_VERBOSE1(
"write_pool::check_all_busy : " << cnt <<
240 " are completed out of " << busy_blocks_size_old <<
" busy blocks");
246 __STXXL_END_NAMESPACE
251 template <
class BlockType>
252 void swap(stxxl::write_pool<BlockType> & a,
253 stxxl::write_pool<BlockType> & b)
259 #endif // !STXXL_WRITE_POOL_HEADER