Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'mc-fix' into mc-fastsnapshot
[simgrid.git] / teshsuite / mc / page_store.cpp
1 #include <string.h>
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include <unistd.h>
5 #include <sys/mman.h>
6
7 #include "mc/mc_page_store.h"
8
9 static int value = 0;
10
11 static void new_content(void* data, size_t size)
12 {
13   memset(data, ++value, size);
14 }
15
16 static void* getpage()
17 {
18   return mmap(NULL, getpagesize(), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
19 }
20
21 int main(int argc, char** argv)
22 {
23   // Init
24   size_t pagesize = (size_t) getpagesize();
25   mc_pages_store_t store = new s_mc_pages_store(500);
26   void* data = getpage();
27
28   // Init:
29   xbt_assert(store->size()==0, "Bad size");
30
31   // Store the page once:
32   new_content(data, pagesize);
33   size_t pageno1 = store->store_page(data);
34   xbt_assert(store->get_ref(pageno1)==1, "Bad refcount");
35   const void* copy = store->get_page(pageno1);
36   xbt_assert(memcmp(data, copy, pagesize)==0, "Page data should be the same");
37   xbt_assert(store->size()==1, "Bad size");
38
39   // Store the same page again:
40   size_t pageno2 = store->store_page(data);
41   xbt_assert(pageno1==pageno2, "Page should be the same");
42   xbt_assert(store->get_ref(pageno1)==2, "Bad refcount");
43   xbt_assert(store->size()==1, "Bad size");
44
45   // Store a new page:
46   new_content(data, pagesize);
47   size_t pageno3 = store->store_page(data);
48   xbt_assert(pageno1 != pageno3, "New page should be different");
49   xbt_assert(store->size()==2, "Bad size");
50
51   // Unref pages:
52   store->unref_page(pageno1);
53   xbt_assert(store->get_ref(pageno1)==1, "Bad refcount");
54   xbt_assert(store->size()==2, "Bad size");
55   store->unref_page(pageno2);
56   xbt_assert(store->size()==1, "Bad size");
57
58   // Reallocate page:
59   new_content(data, pagesize);
60   size_t pageno4 = store->store_page(data);
61   xbt_assert(pageno1 == pageno4, "Page was not reused");
62   xbt_assert(store->get_ref(pageno4)==1, "Bad refcount");
63   xbt_assert(store->size()==2, "Bad size");
64
65   return 0;
66 }