mng/test_mng.cpp

This is an example of use of completion handlers, 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 }

Generated on Thu Jun 4 10:29:29 2009 for Stxxl by  doxygen 1.4.7