Stxxl  1.3.2
mng/test_mng.cpp

This is an example of use of completion handlers, stxxl::block_manager, and stxxl::typed_block

/***************************************************************************
* mng/test_mng.cpp
*
* Part of the STXXL. See http://stxxl.sourceforge.net
*
* Copyright (C) 2002 Roman Dementiev <[email protected]>
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
**************************************************************************/
#include <iostream>
#include <stxxl/request>
#include <stxxl/mng>
#define BLOCK_SIZE (1024 * 512)
struct MyType
{
int integer;
//char chars[4];
~MyType() { }
};
struct my_handler
{
void operator () (stxxl::request * req)
{
STXXL_MSG(req << " done, type=" << req->io_type());
}
};
typedef stxxl::typed_block<BLOCK_SIZE, MyType> block_type;
int main()
{
STXXL_MSG(sizeof(MyType) << " " << (BLOCK_SIZE % sizeof(MyType)));
STXXL_MSG(sizeof(block_type) << " " << BLOCK_SIZE);
const unsigned nblocks = 2;
stxxl::BIDArray<BLOCK_SIZE> bids(nblocks);
std::vector<int> disks(nblocks, 2);
stxxl::request_ptr * reqs = new stxxl::request_ptr[nblocks];
stxxl::block_manager * bm = stxxl::block_manager::get_instance();
bm->new_blocks(stxxl::striping(), bids.begin(), bids.end());
block_type * block = new block_type[2];
STXXL_MSG(std::hex);
STXXL_MSG("Allocated block address : " << long(block));
STXXL_MSG("Allocated block address + 1: " << long(block + 1));
STXXL_MSG(std::dec);
unsigned i = 0;
for (i = 0; i < block_type::size; ++i)
{
block->elem[i].integer = i;
//memcpy (block->elem[i].chars, "STXXL", 4);
}
for (i = 0; i < nblocks; ++i)
reqs[i] = block->write(bids[i], my_handler());
std::cout << "Waiting " << std::endl;
stxxl::wait_all(reqs, nblocks);
for (i = 0; i < nblocks; ++i)
{
reqs[i] = block->read(bids[i], my_handler());
reqs[i]->wait();
for (int j = 0; j < block_type::size; ++j)
{
if (j != block->elem[j].integer)
{
STXXL_MSG("Error in block " << std::hex << i << " pos: " << j
<< " value read: " << block->elem[j].integer);
}
}
}
bm->delete_blocks(bids.begin(), bids.end());
delete[] reqs;
delete[] block;
#if 0
// variable-size blocks, not supported currently
BIDArray<0> vbids(nblocks);
for (i = 0; i < nblocks; i++)
vbids[i].size = 1024 + i;
bm->new_blocks(striping(), vbids.begin(), vbids.end());
for (i = 0; i < nblocks; i++)
STXXL_MSG("Allocated block: offset=" << vbids[i].offset << ", size=" << vbids[i].size);
bm->delete_blocks(vbids.begin(), vbids.end());
#endif
}