1 /***************************************************************************
2  *  tests/mng/test_block_manager2.cpp
3  *
4  *  Part of the STXXL. See http://stxxl.sourceforge.net
5  *
6  *  Copyright (C) 2008 Andreas Beckmann <beckmann@cs.uni-frankfurt.de>
7  *
8  *  Distributed under the Boost Software License, Version 1.0.
9  *  (See accompanying file LICENSE_1_0.txt or copy at
10  *  http://www.boost.org/LICENSE_1_0.txt)
11  **************************************************************************/
12 
13 #include <iostream>
14 #include <stxxl/mng>
15 
16 #define BLOCK_SIZE (1024 * 1024 * 32)
17 
18 typedef stxxl::typed_block<BLOCK_SIZE, int> block_type;
19 template class stxxl::typed_block<BLOCK_SIZE, int>; // forced instantiation
20 
main()21 int main()
22 {
23     stxxl::int64 totalsize = 0;
24     stxxl::config* config = stxxl::config::get_instance();
25 
26     for (size_t i = 0; i < config->disks_number(); ++i)
27         totalsize += config->disk_size(i);
28 
29     stxxl::unsigned_type totalblocks =
30         (stxxl::unsigned_type)(totalsize / block_type::raw_size);
31 
32     STXXL_MSG("external memory: " << totalsize << " bytes  ==  " << totalblocks << " blocks");
33 
34     stxxl::BIDArray<BLOCK_SIZE> b5a(totalblocks / 5);
35     stxxl::BIDArray<BLOCK_SIZE> b5b(totalblocks / 5);
36     stxxl::BIDArray<BLOCK_SIZE> b5c(totalblocks / 5);
37     stxxl::BIDArray<BLOCK_SIZE> b5d(totalblocks / 5);
38     stxxl::BIDArray<BLOCK_SIZE> b2(totalblocks / 2);
39 
40     stxxl::block_manager* bm = stxxl::block_manager::get_instance();
41 
42     STXXL_MSG("get 4 x " << totalblocks / 5);
43     bm->new_blocks(stxxl::striping(), b5a.begin(), b5a.end());
44     bm->new_blocks(stxxl::striping(), b5b.begin(), b5b.end());
45     bm->new_blocks(stxxl::striping(), b5c.begin(), b5c.end());
46     bm->new_blocks(stxxl::striping(), b5d.begin(), b5d.end());
47 
48     STXXL_MSG("free 2 x " << totalblocks / 5);
49     bm->delete_blocks(b5a.begin(), b5a.end());
50     bm->delete_blocks(b5c.begin(), b5c.end());
51 
52     // the external memory should now be fragmented enough,
53     // s.t. the following request needs to be split into smaller ones
54     STXXL_MSG("get 1 x " << totalblocks / 2);
55     bm->new_blocks(stxxl::striping(), b2.begin(), b2.end());
56 
57     bm->delete_blocks(b5b.begin(), b5b.end());
58     bm->delete_blocks(b5d.begin(), b5d.end());
59 
60     bm->delete_blocks(b2.begin(), b2.end());
61 }
62