Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Compare file prefix only.
[simgrid.git] / src / mc / mc_mmu.h
1 /* Copyright (c) 2014-2017. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #ifndef SIMGRID_MC_MMU_H
7 #define SIMGRID_MC_MMU_H
8
9 #include "xbt/misc.h" // xbt_pagesize...
10
11 namespace simgrid {
12 namespace mc {
13 // TODO, do not depend on xbt_pagesize/xbt_pagebits but our own chunk size
14 namespace mmu {
15
16 static int chunkSize()
17 {
18   return xbt_pagesize;
19 }
20
21 /** @brief How many memory pages are necessary to store size bytes?
22  *
23  *  @param size Byte size
24  *  @return Number of memory pages
25  */
26 static XBT_ALWAYS_INLINE std::size_t chunkCount(std::size_t size)
27 {
28   size_t page_count = size >> xbt_pagebits;
29   if (size & (xbt_pagesize-1))
30     page_count ++;
31   return page_count;
32 }
33
34 /** @brief Split into chunk number and remaining offset */
35 static XBT_ALWAYS_INLINE std::pair<std::size_t, std::uintptr_t> split(std::uintptr_t offset)
36 {
37   return {
38     offset >> xbt_pagebits,
39     offset & (xbt_pagesize-1)
40   };
41 }
42
43 /** Merge chunk number and remaining offset info a global offset */
44 static XBT_ALWAYS_INLINE std::uintptr_t join(std::size_t page, std::uintptr_t offset)
45 {
46   return ((std::uintptr_t) page << xbt_pagebits) + offset;
47 }
48
49 static XBT_ALWAYS_INLINE std::uintptr_t join(std::pair<std::size_t, std::uintptr_t> value)
50 {
51   return join(value.first, value.second);
52 }
53
54 static XBT_ALWAYS_INLINE bool sameChunk(std::uintptr_t a, std::uintptr_t b)
55 {
56   return (a >> xbt_pagebits) == (b >> xbt_pagebits);
57 }
58
59 }
60 }
61 }
62
63 #endif