ATLAS Offline Software
PageAccessControl.h
Go to the documentation of this file.
1 // This file's extension implies that it's C, but it's really -*- C++ -*-.
2 
3 /*
4  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
5 */
6 
7 #ifndef CXXUTILS_PAGEACCESSCONTROL_H
8 #define CXXUTILS_PAGEACCESSCONTROL_H 1
9 
22 #include <vector>
23 #include <sys/mman.h> /*PROT_NONE*/
24 
25 #include "CxxUtils/procmaps.h"
26 
28 public:
29  PageAccessControl(size_t reservedSize=65535) :
30  m_pmaps(),
31  m_protectedIsSorted(false)
32  {
33  //we must reserve enough elements, or we risk vector allocating in a protected page during handle()...
34  m_protected.reserve(reservedSize);
35  }
36  PageAccessControl(procmaps& pmaps, size_t reservedSize=65535) :
37  m_pmaps(pmaps),
38  m_protectedIsSorted(false)
39  {
40  //we must reserve enough elements, or we risk vector allocating in a protected page during handle()...
41  m_protected.reserve(reservedSize);
42  }
43 
48  template <typename T>
49  bool protectPage(T* addr, int prot) {
50  return protectPage(addr, sizeof(T), prot);
51  }
52 
54  template <typename T>
55  bool forbidPage(const T* addr) {
56  return forbidPage(addr, sizeof(T));
57  }
58 
60  bool forbidPage(const void* addr, size_t objSize) {
61  return protectPage(addr, objSize, PROT_NONE);
62  }
63 
65  bool forbidPage(const void* addr) {
66  return protectPage(addr, 4, PROT_NONE);
67  }
68 
70  bool protectPage(const void* addr, size_t objSize, int prot);
71 
72  bool restorePageProt(const void * addr);
73  void sort();
74 
76  struct Entry {
77  Entry(const void* a, size_t l, int p, void* pl);
79  const void* addr;
81  size_t lenProt;
82  int prot;
84  void* leak;
87  int restored;
88  };
89 
91  typedef std::vector<Entry> protected_t;
92  typedef protected_t::const_iterator const_iterator;
93  const protected_t& protectedPtrs() const { return m_protected; }
94  const_iterator beginProtectedPtrs() const { return m_protected.begin(); }
95  const_iterator endProtectedPtrs() const { return m_protected.end(); }
96  void reset() { m_protected.clear(); }
97 
99  bool accessed(const void* address) const;
100 
101 private:
102 
105 
106  // can not preallocate map
107  // typedef std::map<void*, size_t, std::less<void*>,
108  // boost::pool_allocator<std::map<void*, size_t>::value_type > > protected_t;
111 };
112 inline
114  return lhs.addr < rhs.addr;
115 }
116 #endif
PageAccessControl::Entry::leak
void * leak
pointer to the heap fragment we leaked before protecting the page
Definition: PageAccessControl.h:84
PageAccessControl::m_protected
protected_t m_protected
Definition: PageAccessControl.h:109
PageAccessControl::forbidPage
bool forbidPage(const T *addr)
forbid access to the page containing addr, setting its prot to PROT_NONE
Definition: PageAccessControl.h:55
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
PageAccessControl::m_protectedIsSorted
bool m_protectedIsSorted
Definition: PageAccessControl.h:110
PageAccessControl::const_iterator
protected_t::const_iterator const_iterator
Definition: PageAccessControl.h:92
PageAccessControl::Entry::restored
int restored
Definition: PageAccessControl.h:87
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
PageAccessControl::PageAccessControl
PageAccessControl(size_t reservedSize=65535)
Definition: PageAccessControl.h:29
PageAccessControl
Definition: PageAccessControl.h:27
PageAccessControl::protectedPtrs
const protected_t & protectedPtrs() const
Definition: PageAccessControl.h:93
PageAccessControl::m_pmaps
procmaps m_pmaps
the content of /proc/self/maps
Definition: PageAccessControl.h:104
procmaps.h
PageAccessControl::forbidPage
bool forbidPage(const void *addr)
FIXME this will not work well for objects spanning across pages.
Definition: PageAccessControl.h:65
operator<
bool operator<(const PageAccessControl::Entry &lhs, const PageAccessControl::Entry &rhs)
Definition: PageAccessControl.h:113
PageAccessControl::beginProtectedPtrs
const_iterator beginProtectedPtrs() const
Definition: PageAccessControl.h:94
RTTAlgmain.address
address
Definition: RTTAlgmain.py:55
PageAccessControl::protected_t
std::vector< Entry > protected_t
the list of protected pages
Definition: PageAccessControl.h:91
a
TList * a
Definition: liststreamerinfos.cxx:10
PageAccessControl::Entry
Definition: PageAccessControl.h:76
procmaps
A simple API to access /proc/self/maps info.
Definition: procmaps.h:18
PageAccessControl::PageAccessControl
PageAccessControl(procmaps &pmaps, size_t reservedSize=65535)
Definition: PageAccessControl.h:36
PageAccessControl::Entry::prot
int prot
Definition: PageAccessControl.h:82
PageAccessControl::Entry::addr
const void * addr
address of page for which protection was requested. Used as key
Definition: PageAccessControl.h:79
PageAccessControl::forbidPage
bool forbidPage(const void *addr, size_t objSize)
forbid access to the page containing addr, setting its prot to PROT_NONE
Definition: PageAccessControl.h:60
PageAccessControl::endProtectedPtrs
const_iterator endProtectedPtrs() const
Definition: PageAccessControl.h:95
PageAccessControl::Entry::lenProt
size_t lenProt
length of the protected region, from page addr to end of protected obj
Definition: PageAccessControl.h:81
PageAccessControl::Entry::Entry
Entry(const void *a, size_t l, int p, void *pl)
Definition: PageAccessControl.cxx:15
TSU::T
unsigned long long T
Definition: L1TopoDataTypes.h:35
PageAccessControl::reset
void reset()
Definition: PageAccessControl.h:96
PageAccessControl::protectPage
bool protectPage(T *addr, int prot)
protect the page containing addr, record the amount of memory we protected NOTE To avoid SEGV,...
Definition: PageAccessControl.h:49