• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • Examples
  • File List

read_write_pool.h

00001 /***************************************************************************
00002  *  include/stxxl/bits/mng/read_write_pool.h
00003  *
00004  *  Part of the STXXL. See http://stxxl.sourceforge.net
00005  *
00006  *  Copyright (C) 2009 Andreas Beckmann <[email protected]>
00007  *
00008  *  Distributed under the Boost Software License, Version 1.0.
00009  *  (See accompanying file LICENSE_1_0.txt or copy at
00010  *  http://www.boost.org/LICENSE_1_0.txt)
00011  **************************************************************************/
00012 
00013 #ifndef STXXL_MNG_READ_WRITE_POOL_H
00014 #define STXXL_MNG_READ_WRITE_POOL_H
00015 
00016 #include <stxxl/bits/mng/write_pool.h>
00017 #include <stxxl/bits/mng/prefetch_pool.h>
00018 
00019 
00020 __STXXL_BEGIN_NAMESPACE
00021 
00024 
00025 
00027 template <typename BlockType>
00028 class read_write_pool : private noncopyable
00029 {
00030 public:
00031     typedef BlockType block_type;
00032     typedef typename block_type::bid_type bid_type;
00033     typedef unsigned_type size_type;
00034 
00035 protected:
00036     typedef write_pool<block_type> write_pool_type;
00037     typedef prefetch_pool<block_type> prefetch_pool_type;
00038 
00039     write_pool_type * w_pool;
00040     prefetch_pool_type * p_pool;
00041     bool delete_pools;
00042 
00043 public:
00047     explicit read_write_pool(size_type init_size_prefetch = 1, size_type init_size_write = 1) :
00048         delete_pools(true)
00049     {
00050         w_pool = new write_pool_type(init_size_write);
00051         p_pool = new prefetch_pool_type(init_size_prefetch);
00052     }
00053 
00054     _STXXL_DEPRECATED(read_write_pool(prefetch_pool_type & p_pool, write_pool_type & w_pool)) :
00055         w_pool(&w_pool), p_pool(&p_pool), delete_pools(false)
00056     { }
00057 
00058     void swap(read_write_pool & obj)
00059     {
00060         std::swap(w_pool, obj.w_pool);
00061         std::swap(p_pool, obj.p_pool);
00062         std::swap(delete_pools, obj.delete_pools);
00063     }
00064 
00066     virtual ~read_write_pool()
00067     {
00068         if (delete_pools) {
00069             delete w_pool;
00070             delete p_pool;
00071         }
00072     }
00073 
00075     size_type size_write() const { return w_pool->size(); }
00076 
00078     size_type size_prefetch() const { return p_pool->size(); }
00079 
00082     void resize_write(size_type new_size)
00083     {
00084         w_pool->resize(new_size);
00085     }
00086 
00089     void resize_prefetch(size_type new_size)
00090     {
00091         p_pool->resize(new_size);
00092     }
00093 
00094     // WRITE POOL METHODS
00095 
00102     request_ptr write(block_type * & block, bid_type bid)
00103     {
00104         request_ptr result = w_pool->write(block, bid);
00105 
00106         // if there is a copy of this block in the prefetch pool,
00107         // it is now a stale copy, so invalidate it and re-hint the block
00108         if (p_pool->invalidate(bid))
00109             p_pool->hint(bid, *w_pool);
00110 
00111         return result;
00112     }
00113 
00116     block_type * steal()
00117     {
00118         return w_pool->steal();
00119     }
00120 
00121     void add(block_type * & block)
00122     {
00123         w_pool->add(block);
00124     }
00125 
00126     // PREFETCH POOL METHODS
00127 
00135     bool hint(bid_type bid)
00136     {
00137         return p_pool->hint(bid, *w_pool);
00138     }
00139 
00140     bool invalidate(bid_type bid)
00141     {
00142         return p_pool->invalidate(bid);
00143     }
00144 
00151     request_ptr read(block_type * & block, bid_type bid)
00152     {
00153         return p_pool->read(block, bid, *w_pool);
00154     }
00155 };
00156 
00158 
00159 __STXXL_END_NAMESPACE
00160 
00161 
00162 namespace std
00163 {
00164     template <class BlockType>
00165     void swap(stxxl::read_write_pool<BlockType> & a,
00166               stxxl::read_write_pool<BlockType> & b)
00167     {
00168         a.swap(b);
00169     }
00170 }
00171 
00172 #endif // !STXXL_MNG_READ_WRITE_POOL_H
00173 // vim: et:ts=4:sw=4

Generated by  doxygen 1.7.1