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;
70 };
71 
72 #include "../LRUList.hpp"
73 
75 
76 void lruTest()
77 {
78  #define OBJCOUNT 20
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 
void reAdd(int index)
Definition: LRUList.hpp:136
int index
Definition: LRU_test.cpp:68
int addNewUnused(T *toAdd)
Definition: LRUList.hpp:111
bool expensiveObjectInUse
Definition: LRU_test.cpp:69
void putOnTop(int index)
Definition: LRUList.hpp:118
#define OBJCOUNT
void lruTest()
Definition: LRU_test.cpp:76
static char * last
Definition: tokenize.c:65