HPCToolkit
LRU_test.cpp
Go to the documentation of this file.
1
// -*-Mode: C++;-*-
2
3
// * BeginRiceCopyright *****************************************************
4
//
5
// $HeadURL$
6
// $Id$
7
//
8
// --------------------------------------------------------------------------
9
// Part of HPCToolkit (hpctoolkit.org)
10
//
11
// Information about sources of support for research and development of
12
// HPCToolkit is at 'hpctoolkit.org' and in 'README.Acknowledgments'.
13
// --------------------------------------------------------------------------
14
//
15
// Copyright ((c)) 2002-2019, Rice University
16
// All rights reserved.
17
//
18
// Redistribution and use in source and binary forms, with or without
19
// modification, are permitted provided that the following conditions are
20
// met:
21
//
22
// * Redistributions of source code must retain the above copyright
23
// notice, this list of conditions and the following disclaimer.
24
//
25
// * Redistributions in binary form must reproduce the above copyright
26
// notice, this list of conditions and the following disclaimer in the
27
// documentation and/or other materials provided with the distribution.
28
//
29
// * Neither the name of Rice University (RICE) nor the names of its
30
// contributors may be used to endorse or promote products derived from
31
// this software without specific prior written permission.
32
//
33
// This software is provided by RICE and contributors "as is" and any
34
// express or implied warranties, including, but not limited to, the
35
// implied warranties of merchantability and fitness for a particular
36
// purpose are disclaimed. In no event shall RICE or contributors be
37
// liable for any direct, indirect, incidental, special, exemplary, or
38
// consequential damages (including, but not limited to, procurement of
39
// substitute goods or services; loss of use, data, or profits; or
40
// business interruption) however caused and on any theory of liability,
41
// whether in contract, strict liability, or tort (including negligence
42
// or otherwise) arising in any way out of the use of this software, even
43
// if advised of the possibility of such damage.
44
//
45
// ******************************************************* EndRiceCopyright *
46
47
//***************************************************************************
48
//
49
// File:
50
// $HeadURL$
51
//
52
// Purpose:
53
// [The purpose of this file]
54
//
55
// Description:
56
// [The set of functions, macros, etc. defined in the file]
57
//
58
//***************************************************************************
59
60
61
#undef NDEBUG
62
63
#include <iostream>
64
#include <cassert>
65
using namespace
std
;
66
struct
TestData
67
{
68
int
index
;
69
bool
expensiveObjectInUse
;
70
};
71
72
#include "../LRUList.hpp"
73
74
using
TraceviewerServer::LRUList
;
75
76
void
lruTest
()
77
{
78
#define OBJCOUNT 20
79
LRUList<TestData>
list(
OBJCOUNT
);
80
81
srand(12);
82
bool
inuse[
OBJCOUNT
];
//Just for testing
83
for
(
int
i = 0; i<
OBJCOUNT
; i++)
84
{
85
TestData
* next =
new
TestData
;
86
if
(rand() % 2 == 0)
87
{
88
next->
expensiveObjectInUse
=
true
;
89
next->
index
= list.
addNew
(next);
90
inuse[next->
index
] =
true
;
91
}
92
else
93
{
94
next->
expensiveObjectInUse
=
false
;
95
next->
index
= list.
addNewUnused
(next);
96
inuse[next->
index
] =
false
;
97
}
98
}
99
assert(list.
getTotalPageCount
()==
OBJCOUNT
);
100
list.dump();
101
102
for
(
int
i = 0; i< 70; i++)
103
{
104
int
x = rand() %
OBJCOUNT
;
105
if
(inuse[x])
106
list.
putOnTop
(x);
107
}
108
for
(
int
i = 0; i <
OBJCOUNT
; ++i) {
109
if
(!inuse[i]){
110
inuse[i] =
true
;
111
list.
reAdd
(i);
112
}
113
}
114
list.dump();
115
assert(list.
getUsedPageCount
()==
OBJCOUNT
);
116
int
count =
OBJCOUNT
;
117
for
(
int
i = 0; i <
OBJCOUNT
; i++)
118
cout << i <<
": "
<< inuse[i]<<endl;
119
for
(
int
i = 0; i< 12; i++)
120
{
121
TestData
*
last
= list.
getLast
();
122
last->
expensiveObjectInUse
=
false
;
123
inuse[last->
index
] =
false
;
124
list.
removeLast
();
125
assert(list.
getUsedPageCount
() == --count);
126
127
int
ran;
128
if
(inuse[ran = (rand()%OBJCOUNT)])
129
list.
putOnTop
(ran);
130
if
(!inuse[ran = (rand()%OBJCOUNT)])
131
{
132
inuse[ran] =
true
;
133
list.
reAdd
(ran);
134
assert(list.
getUsedPageCount
() == ++count);
135
}
136
}
137
list.dump();
138
139
while
(list.
getUsedPageCount
() > 0)
140
{
141
cout <<
"Removing: "
<< list.
getLast
()->
index
<<endl;
142
list.
removeLast
();
143
int
dumpc = list.dump();
144
145
//assert(list.getUsedPageCount()==list.dump());
146
}
147
assert(list.
getUsedPageCount
()==0);
148
for
(
int
i = 0; i<
OBJCOUNT
; i++)
149
{
150
list.
reAdd
(i);
151
}
152
assert(list.
getUsedPageCount
()==
OBJCOUNT
);
153
list.dump();
154
cout <<
"List operations did not crash and were probably successful"
<<endl;
155
}
156
TraceviewerServer::LRUList::reAdd
void reAdd(int index)
Definition:
LRUList.hpp:136
TraceviewerServer::LRUList::getTotalPageCount
int getTotalPageCount()
Definition:
LRUList.hpp:143
std
TestData::index
int index
Definition:
LRU_test.cpp:68
TraceviewerServer::LRUList::getLast
T * getLast()
Definition:
LRUList.hpp:126
TraceviewerServer::LRUList::addNewUnused
int addNewUnused(T *toAdd)
Definition:
LRUList.hpp:111
TraceviewerServer::LRUList
Definition:
LRUList.hpp:75
TestData::expensiveObjectInUse
bool expensiveObjectInUse
Definition:
LRU_test.cpp:69
TraceviewerServer::LRUList::removeLast
void removeLast()
Definition:
LRUList.hpp:131
TestData
Definition:
LRU_test.cpp:66
TraceviewerServer::LRUList::addNew
int addNew(T *toAdd)
Definition:
LRUList.hpp:102
TraceviewerServer::LRUList::putOnTop
void putOnTop(int index)
Definition:
LRUList.hpp:118
TraceviewerServer::LRUList::getUsedPageCount
int getUsedPageCount()
Definition:
LRUList.hpp:147
OBJCOUNT
#define OBJCOUNT
lruTest
void lruTest()
Definition:
LRU_test.cpp:76
last
static char * last
Definition:
tokenize.c:65
src
tool
hpcserver
UnitTests
LRU_test.cpp
Generated by
1.8.13