stxxl::block_manager
, and stxxl::typed_block
00001 /*************************************************************************** 00002 * mng/test_mng.cpp 00003 * 00004 * Part of the STXXL. See http://stxxl.sourceforge.net 00005 * 00006 * Copyright (C) 2002 Roman Dementiev <dementiev@mpi-sb.mpg.de> 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 00016 00017 #include <iostream> 00018 #include <stxxl/mng> 00019 00020 #define BLOCK_SIZE (1024 * 512) 00021 00022 struct MyType 00023 { 00024 int integer; 00025 //char chars[4]; 00026 ~MyType() { } 00027 }; 00028 00029 struct my_handler 00030 { 00031 void operator () (stxxl::request * req) 00032 { 00033 STXXL_MSG(req << " done, type=" << req->io_type()); 00034 } 00035 }; 00036 00037 typedef stxxl::typed_block<BLOCK_SIZE, MyType> block_type; 00038 00039 int main() 00040 { 00041 STXXL_MSG(sizeof(MyType) << " " << (BLOCK_SIZE % sizeof(MyType))); 00042 STXXL_MSG(sizeof(block_type) << " " << BLOCK_SIZE); 00043 const unsigned nblocks = 2; 00044 stxxl::BIDArray<BLOCK_SIZE> bids(nblocks); 00045 std::vector<int> disks(nblocks, 2); 00046 stxxl::request_ptr * reqs = new stxxl::request_ptr[nblocks]; 00047 stxxl::block_manager * bm = stxxl::block_manager::get_instance(); 00048 bm->new_blocks(stxxl::striping(), bids.begin(), bids.end()); 00049 00050 block_type * block = new block_type[2]; 00051 STXXL_MSG(std::hex); 00052 STXXL_MSG("Allocated block address : " << long(block)); 00053 STXXL_MSG("Allocated block address + 1: " << long(block + 1)); 00054 STXXL_MSG(std::dec); 00055 unsigned i = 0; 00056 for (i = 0; i < block_type::size; ++i) 00057 { 00058 block->elem[i].integer = i; 00059 //memcpy (block->elem[i].chars, "STXXL", 4); 00060 } 00061 for (i = 0; i < nblocks; ++i) 00062 reqs[i] = block->write(bids[i], my_handler()); 00063 00064 00065 std::cout << "Waiting " << std::endl; 00066 stxxl::wait_all(reqs, nblocks); 00067 00068 for (i = 0; i < nblocks; ++i) 00069 { 00070 reqs[i] = block->read(bids[i], my_handler()); 00071 reqs[i]->wait(); 00072 for (int j = 0; j < block_type::size; ++j) 00073 { 00074 if (j != block->elem[j].integer) 00075 { 00076 STXXL_MSG("Error in block " << std::hex << i << " pos: " << j 00077 << " value read: " << block->elem[j].integer); 00078 } 00079 } 00080 } 00081 00082 00083 bm->delete_blocks(bids.begin(), bids.end()); 00084 00085 delete[] reqs; 00086 delete[] block; 00087 00088 #if 0 00089 // variable-size blocks, not supported currently 00090 00091 BIDArray<0> vbids(nblocks); 00092 for (i = 0; i < nblocks; i++) 00093 vbids[i].size = 1024 + i; 00094 00095 bm->new_blocks(striping(), vbids.begin(), vbids.end()); 00096 00097 for (i = 0; i < nblocks; i++) 00098 STXXL_MSG("Allocated block: offset=" << vbids[i].offset << ", size=" << vbids[i].size); 00099 00100 bm->delete_blocks(vbids.begin(), vbids.end()); 00101 #endif 00102 }