ATLAS Offline Software
PageAccessControlSvc.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 #include "PageAccessControlSvc.h"
9  ISvcLocator* pSvcLocator ) :
10  base_class(name, pSvcLocator), m_saveSEGVaction(),
11  m_accessControl(), m_SEGVHandler(m_accessControl)
12 {
13  //pass m_SEGVHandler pointer to cPtrAccessSEGVHandler
14  setPtrAccessSEGVHandler(&m_SEGVHandler);
15  declareProperty("AutoMonitoring", m_autoMonitor=true,
16  "start monitoring on initialize, stop on finalize");
17 }
18 
20  int rc = sigaction(SIGSEGV,nullptr, &m_saveSEGVaction);
21  if (0==rc) {
22  struct sigaction sa(m_saveSEGVaction);
23  sa.sa_sigaction= cPtrAccessSEGVHandler;
24  sa.sa_flags=SA_SIGINFO;
25  //off we go
26  rc=sigaction(SIGSEGV,&sa,nullptr);
27  }
28  return (0==rc);
29 }
30 
32  return (0 == sigaction(SIGSEGV,&m_saveSEGVaction, nullptr));
33 }
34 
36 bool PageAccessControlSvc::accessed(const void* address) const {
37  return m_accessControl.accessed(address);
38 }
39 
41  StatusCode sc(StatusCode::SUCCESS);
42  msg(MSG::INFO) << "Initializing " << name() << endmsg ;
43  if (m_autoMonitor.value() && !this->startMonitoring()) sc = StatusCode::FAILURE;
44  return sc;
45 }
46 
48  StatusCode sc(StatusCode::SUCCESS);
49  if (m_autoMonitor.value()) {
50  if (this->stopMonitoring()) this->report();
51  else sc = StatusCode::FAILURE;
52  }
53  return sc;
54 }
55 
57  msg(MSG::INFO) << "Access monitoring report" << endmsg;
60  while (i != e) {
61  msg(MSG::DEBUG) << "accessed pointer at @" << std::hex << *i++ << endmsg;
62  }
63  PageAccessControl::const_iterator ia(m_accessControl.beginProtectedPtrs()),
64  ea(m_accessControl.endProtectedPtrs());
65  while (ia != ea) {
66  msg(MSG::DEBUG) << "protected page at @" << std::hex << ia->addr
67  << " accessed "<< ia->restored << " times" << endmsg;
68  ++ia;
69  }
70 }
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
PtrAccessSEGVHandler::const_iterator
accessed_t::const_iterator const_iterator
Definition: PtrAccessSEGVHandler.h:32
cPtrAccessSEGVHandler.h
a C wrapper providing access to PtrAccessSEGVHandler::handle the way sigaction wants it Example: PtrA...
PageAccessControlSvc::m_accessControl
PageAccessControl m_accessControl
Definition: PageAccessControlSvc.h:86
PageAccessControlSvc::finalize
virtual StatusCode finalize()
Definition: PageAccessControlSvc.cxx:47
PageAccessControlSvc::m_saveSEGVaction
struct sigaction m_saveSEGVaction
the default action for SIGSEGV
Definition: PageAccessControlSvc.h:85
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
PageAccessControlSvc::stopMonitoring
virtual bool stopMonitoring()
Definition: PageAccessControlSvc.cxx:31
PtrAccessSEGVHandler::endAccessedPtrs
const_iterator endAccessedPtrs() const
Definition: PtrAccessSEGVHandler.h:35
lumiFormat.i
int i
Definition: lumiFormat.py:85
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
PageAccessControlSvc::accessed
virtual bool accessed(const void *address) const
has this pointer been accessed (read/written)
Definition: PageAccessControlSvc.cxx:36
PageAccessControlSvc::initialize
virtual StatusCode initialize()
Definition: PageAccessControlSvc.cxx:40
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
RTTAlgmain.address
address
Definition: RTTAlgmain.py:55
PageAccessControlSvc.h
A service that monitors access to memory pages.
PtrAccessSEGVHandler::beginAccessedPtrs
const_iterator beginAccessedPtrs() const
Definition: PtrAccessSEGVHandler.h:34
PageAccessControlSvc::report
virtual void report() const
In baseline implementation, controlled via PageAccessControlSvc.OutputLevel
Definition: PageAccessControlSvc.cxx:56
PageAccessControlSvc::startMonitoring
virtual bool startMonitoring()
In baseline implementation, protect pages and install a SEGV handler that counts the number of access...
Definition: PageAccessControlSvc.cxx:19
PageAccessControlSvc::m_autoMonitor
BooleanProperty m_autoMonitor
start on init, stop on finalize
Definition: PageAccessControlSvc.h:88
PageAccessControlSvc::PageAccessControlSvc
PageAccessControlSvc(const std::string &name, ISvcLocator *pSvcLocator) ATLAS_CTORDTOR_NOT_THREAD_SAFE
Standard GAUDI constructor.
Definition: PageAccessControlSvc.cxx:8
DEBUG
#define DEBUG
Definition: page_access.h:11
PageAccessControlSvc::m_SEGVHandler
PtrAccessSEGVHandler m_SEGVHandler
Definition: PageAccessControlSvc.h:87
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7