ATLAS Offline Software
Loading...
Searching...
No Matches
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
9 ISvcLocator* pSvcLocator ) :
10 base_class(name, pSvcLocator), m_saveSEGVaction(),
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
36bool 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;
59 e(m_SEGVHandler.endAccessedPtrs());
60 while (i != e) {
61 msg(MSG::DEBUG) << "accessed pointer at @" << std::hex << *i++ << endmsg;
62 }
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}
#define endmsg
static Double_t sc
static Double_t rc
A service that monitors access to memory pages.
a C wrapper providing access to PtrAccessSEGVHandler::handle the way sigaction wants it Example: PtrA...
PageAccessControlSvc(const std::string &name, ISvcLocator *pSvcLocator) ATLAS_NOT_THREAD_SAFE
Standard GAUDI constructor.
struct sigaction m_saveSEGVaction
the default action for SIGSEGV
BooleanProperty m_autoMonitor
start on init, stop on finalize
virtual StatusCode initialize()
virtual void report() const
In baseline implementation, controlled via PageAccessControlSvc.OutputLevel.
virtual StatusCode finalize()
virtual bool accessed(const void *address) const
has this pointer been accessed (read/written)
virtual bool startMonitoring()
In baseline implementation, protect pages and install a SEGV handler that counts the number of access...
PageAccessControl m_accessControl
PtrAccessSEGVHandler m_SEGVHandler
protected_t::const_iterator const_iterator
accessed_t::const_iterator const_iterator
MsgStream & msg
Definition testRead.cxx:32