rambrain
testManagedDummySwap.cpp
Go to the documentation of this file.
1 /* rambrain - a dynamical physical memory extender
2  * Copyright (C) 2015 M. Imgrund, A. Arth
3  * mimgrund (at) mpifr-bonn.mpg.de
4  * arth (at) usm.uni-muenchen.de
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include <gtest/gtest.h>
21 #include "cyclicManagedMemory.h"
22 #include "managedPtr.h"
23 #include "managedDummySwap.h"
24 #include "exceptions.h"
25 
26 using namespace rambrain;
27 
32 TEST ( managedDummySwap, Unit_ManualSwapping )
33 {
34  const unsigned int dblamount = 100;
35  const unsigned int dblsize = dblamount * sizeof ( double );
36  const unsigned int swapmem = dblsize * 10;
37  managedDummySwap swap ( swapmem );
38  cyclicManagedMemory mem ( &swap, 10 * kib ); //Need this as default memory manager will get corrupted without (memory claims...);
39 
40  ASSERT_EQ ( swapmem, swap.getSwapSize() );
41  ASSERT_EQ ( 0u, swap.getUsedSwap() );
42 #ifdef PARENTAL_CONTROL
43  managedMemoryChunk *chunk = new managedMemoryChunk ( 0, 1 );
44 #else
45  managedMemoryChunk *chunk = new managedMemoryChunk ( 1 );
46 #endif
47  chunk->status = MEM_ALLOCATED;
48  chunk->locPtr = malloc ( dblsize );
49  chunk->size = dblsize;
50 
51  swap.swapOut ( chunk );
52 
53  ASSERT_EQ ( swapmem, swap.getSwapSize() );
54  ASSERT_EQ ( dblsize, swap.getUsedSwap() );
55 
56  swap.swapIn ( chunk );
57 
58  ASSERT_EQ ( swapmem, swap.getSwapSize() );
59  ASSERT_EQ ( 0u, swap.getUsedSwap() );
60 
61  free ( chunk->locPtr );
62  delete chunk;
63 }
64 
69 TEST ( managedDummySwap, Unit_ManualMultiSwapping )
70 {
71  const unsigned int dblamount = 100;
72  const unsigned int dblsize = dblamount * sizeof ( double );
73  const unsigned int swapmem = dblsize * 10;
74  managedDummySwap swap ( swapmem );
75  cyclicManagedMemory mem ( &swap, 10 * kib ); //Need this as default memory manager will get corrupted without (memory claims...);
76 
77  ASSERT_EQ ( swapmem, swap.getSwapSize() );
78  ASSERT_EQ ( 0u, swap.getUsedSwap() );
79 
80  managedMemoryChunk *chunks[2];
81  for ( int i = 0; i < 2; ++i ) {
82 #ifdef PARENTAL_CONTROL
83  chunks[i] = new managedMemoryChunk ( 0, i + 1 );
84 #else
85  chunks[i] = new managedMemoryChunk ( i + 1 );
86 #endif
87  chunks[i]->status = MEM_ALLOCATED;
88  chunks[i]->locPtr = malloc ( dblsize );
89  chunks[i]->size = dblsize;
90  }
91 
92  swap.swapOut ( chunks, 2 );
93 
94  ASSERT_EQ ( swapmem, swap.getSwapSize() );
95  ASSERT_EQ ( 2 * dblsize, swap.getUsedSwap() );
96 
97  swap.swapIn ( chunks, 2 );
98 
99  ASSERT_EQ ( swapmem, swap.getSwapSize() );
100  ASSERT_EQ ( 0u, swap.getUsedSwap() );
101 
102  for ( int i = 0; i < 2; ++i ) {
103  if ( chunks[i]->status == MEM_SWAPPED ) {
104  free ( chunks[i]->swapBuf );
105  } else {
106  free ( chunks[i]->locPtr );
107  }
108 
109  delete chunks[i];
110  }
111 }
112 
117 TEST ( managedDummySwap, Unit_ManualSwappingDelete )
118 {
119  const unsigned int dblamount = 100;
120  const unsigned int dblsize = dblamount * sizeof ( double );
121  const unsigned int swapmem = dblsize * 10;
122  managedDummySwap swap ( swapmem );
123  cyclicManagedMemory mem ( &swap, 10 * kib ); //Need this as default memory manager will get corrupted without (memory claims...);
124  ASSERT_EQ ( swapmem, swap.getSwapSize() );
125  ASSERT_EQ ( 0u, swap.getUsedSwap() );
126 #ifdef PARENTAL_CONTROL
127  managedMemoryChunk *chunk = new managedMemoryChunk ( 0, 1 );
128 #else
129  managedMemoryChunk *chunk = new managedMemoryChunk ( 1 );
130 #endif
131  chunk->status = MEM_ALLOCATED;
132  chunk->locPtr = malloc ( dblsize );
133  chunk->size = dblsize;
134 
135  swap.swapOut ( chunk );
136 
137  ASSERT_EQ ( swapmem, swap.getSwapSize() );
138  ASSERT_EQ ( dblsize, swap.getUsedSwap() );
139 
140  swap.swapDelete ( chunk );
141 
142  ASSERT_EQ ( swapmem, swap.getSwapSize() );
143  ASSERT_EQ ( 0u, swap.getUsedSwap() );
144 
145  delete chunk;
146 }
147 
152 TEST ( managedDummySwap, Unit_SwapSize )
153 {
154  const unsigned int dblamount = 100;
155  const unsigned int dblsize = dblamount * sizeof ( double );
156  const unsigned int swapmem = dblsize * 10;
157  const unsigned int memsize = dblsize * 1.5;
158  managedDummySwap swap ( swapmem );
159  cyclicManagedMemory manager ( &swap, memsize );
160 
161  ASSERT_EQ ( swapmem, swap.getSwapSize() );
162  ASSERT_EQ ( 0u, swap.getUsedSwap() );
163 
164  managedPtr<double> *ptr1 = new managedPtr<double> ( dblamount );
165 
166  ASSERT_EQ ( swapmem, swap.getSwapSize() );
167  ASSERT_EQ ( 0u, swap.getUsedSwap() );
168 
169  ptr1->setUse();
170 
171  ASSERT_EQ ( swapmem, swap.getSwapSize() );
172  ASSERT_EQ ( 0u, swap.getUsedSwap() );
173 
174  ptr1->unsetUse();
175 
176  managedPtr<double> *ptr2 = new managedPtr<double> ( dblamount );
177 
178  ASSERT_EQ ( swapmem, swap.getSwapSize() );
179  ASSERT_EQ ( dblsize, swap.getUsedSwap() );
180 
181  ptr2->setUse();
182 
183  ASSERT_EQ ( swapmem, swap.getSwapSize() );
184  ASSERT_EQ ( dblsize, swap.getUsedSwap() );
185 
186  ptr2->unsetUse();
187 
188  ASSERT_EQ ( swapmem, swap.getSwapSize() );
189  ASSERT_EQ ( dblsize, swap.getUsedSwap() );
190 
191  delete ptr1;
192 
193  ASSERT_EQ ( swapmem, swap.getSwapSize() );
194  ASSERT_EQ ( 0u, swap.getUsedSwap() );
195 
196  delete ptr2;
197 }
198 
void * locPtr
pointer to the actual data in RAM
virtual global_bytesize getUsedSwap() const
Simple getter.
Definition: managedSwap.h:86
virtual global_bytesize swapOut(managedMemoryChunk **chunklist, unsigned int nchunks)
Trigger swap out of the chunks pointed to by chunklist.
Main class to allocate memory that is managed by the rambrain memory defaultManager.
Definition: managedMemory.h:54
virtual void swapDelete(managedMemoryChunk *chunk)
Mark chunk as deleted.
virtual global_bytesize getSwapSize() const
Simple getter.
Definition: managedSwap.h:82
const global_bytesize kib
Definition: common.h:67
manages all managed Chunks of raw memory
scheduler working with a double linked cycle. Details see paper.
global_bytesize size
Size of actual object in bytes.
A dummy swap that just copies swapped out chunks to a different location in ram.
TEST(managedDummySwap, Unit_ManualSwapping)
virtual global_bytesize swapIn(managedMemoryChunk **chunklist, unsigned int nchunks)
Trigger swap in of the chunks pointed to by chunklist.