ATLAS Offline Software
PageAccessControlSvc.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 #include "PageAccessControlSvc.h"
9  ISvcLocator* pSvcLocator ) :
10  AthService(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 // Query the interfaces.
56 // Input: riid, Requested interface ID
57 // ppvInterface, Pointer to requested interface
58 // Return: StatusCode indicating SUCCESS or FAILURE.
59 // N.B. Don't forget to release the interface after use!!!
61 PageAccessControlSvc::queryInterface(const InterfaceID& riid, void** ppvInterface)
62 {
63  if ( IPageAccessControlSvc::interfaceID().versionMatch(riid) ) {
64  *ppvInterface = (IPageAccessControlSvc*)this;
65  }
66  else {
67  // Interface is not directly available: try out a base class
68  return Service::queryInterface(riid, ppvInterface);
69  }
70  this->addRef();
71  return StatusCode::SUCCESS;
72 }
73 
74 
76  msg(MSG::INFO) << "Access monitoring report" << endmsg;
79  while (i != e) {
80  msg(MSG::DEBUG) << "accessed pointer at @" << std::hex << *i++ << endmsg;
81  }
82  PageAccessControl::const_iterator ia(m_accessControl.beginProtectedPtrs()),
83  ea(m_accessControl.endProtectedPtrs());
84  while (ia != ea) {
85  msg(MSG::DEBUG) << "protected page at @" << std::hex << ia->addr
86  << " accessed "<< ia->restored << " times" << endmsg;
87  ++ia;
88  }
89 }
PtrAccessSEGVHandler::const_iterator
accessed_t::const_iterator const_iterator
Definition: PtrAccessSEGVHandler.h:32
IPageAccessControlSvc::interfaceID
static const InterfaceID & interfaceID()
Retrieve interface ID.
Definition: IPageAccessControlSvc.h:56
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:90
PageAccessControlSvc::finalize
virtual StatusCode finalize()
Definition: PageAccessControlSvc.cxx:47
PageAccessControlSvc::m_saveSEGVaction
struct sigaction m_saveSEGVaction
the default action for SIGSEGV
Definition: PageAccessControlSvc.h:89
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
IPageAccessControlSvc
Interface to a service that monitors memory page accesses.
Definition: IPageAccessControlSvc.h:30
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:92
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
AthService
Definition: AthService.h:32
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
PageAccessControlSvc::queryInterface
virtual StatusCode queryInterface(const InterfaceID &riid, void **ppvInterface)
Definition: PageAccessControlSvc.cxx:61
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
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:75
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
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:92
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
AthCommonMsg< Service >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
PageAccessControlSvc::m_SEGVHandler
PtrAccessSEGVHandler m_SEGVHandler
Definition: PageAccessControlSvc.h:91
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15