Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Public Types | Public Member Functions | Private Member Functions | Private Attributes | List of all members
ProxyProviderSvc Class Reference

manages the address providers and add proxies on demand to the store More...

#include <ProxyProviderSvc.h>

Inheritance diagram for ProxyProviderSvc:
Collaboration diagram for ProxyProviderSvc:

Public Types

typedef std::list< IAddressProvider * >::iterator pAPiterator
 
typedef std::list< SG::TransientAddress * > TAdList
 
typedef TAdList::iterator TAdIterator
 

Public Member Functions

virtual StatusCode preLoadProxies (IProxyRegistry &storeToModify) override
 IProxyProvider interface. More...
 
virtual StatusCode loadProxies (IProxyRegistry &storeToModify) override
 add proxies to the store to modify (during Begin Event) More...
 
virtual SG::DataProxyretrieveProxy (const CLID &id, const std::string &key, IProxyRegistry &storeToModify) override
 Use a provider to create a proxy for ID/KEY. More...
 
SG::DataProxyaddAddress (IProxyRegistry &storeToModify, SG::TransientAddress &&tad)
 create a new Proxy, overriding CLID and/or key More...
 
virtual void addProvider (IAddressProvider *aProvider) override final
 IAddressProvider manager functionality add a provider to the set of known ones. More...
 
virtual StatusCode initialize () override
 Service boilerplate. More...
 
 ProxyProviderSvc (const std::string &name, ISvcLocator *svcLoc)
 Standard Service Constructor. More...
 
virtual ~ProxyProviderSvc ()
 

Private Member Functions

const EventContext & contextFromStore (IProxyRegistry &ds) const
 Retrieve the EventContext saved in store DS. More...
 
StatusCode addAddresses (IProxyRegistry &store, TAdList &tList)
 Add lists of TADs to the store. More...
 
void providerNamesPropertyHandler (Gaudi::Details::PropertyBase &theProp)
 the handler for m_providerNames More...
 
StatusCode doPreLoadProxies (IProxyRegistry &storeToModify)
 

Private Attributes

StringArrayProperty m_providerNames
 property: the services declared as providers More...
 
std::list< IAddressProvider * > m_providers
 the providers we know about. WE DON'T OWN THEM More...
 
ServiceHandle< IConversionSvc > m_pDataLoader
 Persistency Service. More...
 
std::vector< IProxyRegistry * > m_pendingLoad
 List of pending stores on which to run preLoadProxies(). More...
 

Detailed Description

manages the address providers and add proxies on demand to the store

Definition at line 41 of file ProxyProviderSvc.h.

Member Typedef Documentation

◆ pAPiterator

typedef std::list<IAddressProvider*>::iterator ProxyProviderSvc::pAPiterator

Definition at line 44 of file ProxyProviderSvc.h.

◆ TAdIterator

typedef TAdList::iterator ProxyProviderSvc::TAdIterator

Definition at line 46 of file ProxyProviderSvc.h.

◆ TAdList

Definition at line 45 of file ProxyProviderSvc.h.

Constructor & Destructor Documentation

◆ ProxyProviderSvc()

ProxyProviderSvc::ProxyProviderSvc ( const std::string &  name,
ISvcLocator *  svcLoc 
)

Standard Service Constructor.

Definition at line 51 of file ProxyProviderSvc.cxx.

52  :
53  base_class(name, svcLoc),
54  m_pDataLoader("EventPersistencySvc", name)
55 {
57 }

◆ ~ProxyProviderSvc()

ProxyProviderSvc::~ProxyProviderSvc ( )
virtual

Definition at line 59 of file ProxyProviderSvc.cxx.

59 {}

Member Function Documentation

◆ addAddress()

SG::DataProxy * ProxyProviderSvc::addAddress ( IProxyRegistry storeToModify,
SG::TransientAddress &&  tad 
)

create a new Proxy, overriding CLID and/or key

Definition at line 183 of file ProxyProviderSvc.cxx.

185 {
186  //HACK! The proxies for all object those key starts with "HLTAutoKey" will be deleted at the end of each event (resetOnly=false)
187  //hence avoiding the proxy explosion observed with trigger object for releases <= 14.1.0
188  bool resetOnly(tAddr.name().substr(0,10) != std::string("HLTAutoKey"));
189  // std::cout << "PPS:addAdress: proxy for key " << tAddr->name() << " has resetOnly " << resetOnly << std::endl;
190  SG::DataProxy* dp = new SG::DataProxy(std::move(tAddr),
191  m_pDataLoader.get(), true, resetOnly );
192 
193  // Must add the primary CLID first.
194  bool addedProxy = store.addToStore(dp->clID(), dp).isSuccess();
195  // ATH_MSG_VERBOSE("created proxy for " << tAddr->clID() << "/" << tAddr->name() << "using " << m_pDataLoader->repSvcType());
196  if (!addedProxy) {
197  ATH_MSG_ERROR ("Failed to add proxy to store "
198  << dp->clID() << "/" << dp->name());
199  delete dp;
200  dp = nullptr;
201  }
202  else {
203  // loop over all the transient CLIDs:
204  SG::TransientAddress::TransientClidSet tClid = dp->transientID();
205  for (CLID clid : tClid) {
206  if (clid != dp->clID()) {
207  bool flag = (store.addToStore(clid, dp)).isSuccess();
208  if (!flag) {
209  ATH_MSG_ERROR ("Failed to add proxy to store for symlink "
210  << clid << "/" << dp->name());
211  }
212  addedProxy &= flag;
213  }
214  }
215 
216  // loop over all alias'
217  for (const std::string& alias : dp->alias()) {
218  (store.addAlias(alias, dp)).ignore();
219  }
220 
221  // Add any other allowable conversions.
222  const SG::BaseInfoBase* bi = getBaseInfo (dp->clID());
223  if (bi) {
224  for (CLID clid : bi->get_bases()) {
225  if (std::find (tClid.begin(), tClid.end(), clid) == tClid.end()) {
226  store.addToStore (clid, dp).ignore();
227  dp->setTransientID (clid);
228  }
229  }
230 
231  for (CLID clid : bi->get_copy_conversions()) {
232  if (std::find (tClid.begin(), tClid.end(), clid) == tClid.end()) {
233  store.addToStore (clid, dp).ignore();
234  dp->setTransientID (clid);
235  }
236  }
237  }
238  }
239 
240  return dp;
241 }

◆ addAddresses()

StatusCode ProxyProviderSvc::addAddresses ( IProxyRegistry store,
TAdList tList 
)
private

Add lists of TADs to the store.

Parameters
storeStore to which to add.
tListList of TADs from all providers.

if proxy exists, simply update the proxy with new TransientAddress, else construct a new proxy

Definition at line 157 of file ProxyProviderSvc.cxx.

159 {
160  for (SG::TransientAddress* tad : tList) {
161  SG::DataProxy* proxy = store.proxy_exact(tad->clID(), tad->name());
164  if (0 != proxy)
165  {
166  proxy->setAddress(tad->address());
167  if (proxy->provider() == 0) {
168  proxy->setProvider(tad->provider(), store.storeID());
169  }
170  }
171  else {
172  if ( 0 == addAddress(store, std::move(*tad)) ) return StatusCode::FAILURE;
173  }
174  delete tad;
175  }
176 
177  return StatusCode::SUCCESS;
178 }

◆ addProvider()

void ProxyProviderSvc::addProvider ( IAddressProvider aProvider)
inlinefinaloverridevirtual

IAddressProvider manager functionality add a provider to the set of known ones.

PROVIDER IS OWNED BY THE CLIENT

Definition at line 119 of file ProxyProviderSvc.h.

119  {
120  assert(aProvider);
121  if (find(m_providers.begin(), m_providers.end(), aProvider) == m_providers.end()) {
122  m_providers.push_back(aProvider);
123  }
124 }

◆ contextFromStore()

const EventContext & ProxyProviderSvc::contextFromStore ( IProxyRegistry ds) const
private

Retrieve the EventContext saved in store DS.

Parameters
dsThe store from which to retrieve the context.

If there is no context recorded in the store, return a default-initialized context.

Definition at line 273 of file ProxyProviderSvc.cxx.

274 {
276  "EventContext");
277  if (proxy) {
278  EventContext* ctx = SG::DataProxy_cast<EventContext> (proxy);
279  if (ctx) return *ctx;
280  }
281  static const EventContext emptyContext;
282  return emptyContext;
283 }

◆ doPreLoadProxies()

StatusCode ProxyProviderSvc::doPreLoadProxies ( IProxyRegistry storeToModify)
private

Definition at line 101 of file ProxyProviderSvc.cxx.

102 {
103  if (m_providers.empty()) return StatusCode::SUCCESS;
104 
105  StoreID::type storeID = store.storeID();
106  TAdList tList;
107  for (IAddressProvider* provider : m_providers) {
108  ATH_CHECK( provider->preLoadAddresses(storeID, tList) );
109  setProviderOnList (tList, provider, storeID);
110  }
111  ATH_CHECK( addAddresses (store, tList) );
112  return StatusCode::SUCCESS;
113 }

◆ initialize()

StatusCode ProxyProviderSvc::initialize ( )
overridevirtual

Service boilerplate.

Definition at line 62 of file ProxyProviderSvc.cxx.

63 {
64  ATH_MSG_VERBOSE( "Initializing " << name() );
65 
66  // retrieve Persistency Service
67  ATH_CHECK( m_pDataLoader.retrieve() );
68 
69  // get properties set
71 
72  // Take care of any pending preLoadProxies requests.
73  for (IProxyRegistry* reg : m_pendingLoad) {
74  ATH_CHECK( doPreLoadProxies (*reg) );
75  }
76  m_pendingLoad.clear();
77 
78  return StatusCode::SUCCESS;
79 }

◆ loadProxies()

StatusCode ProxyProviderSvc::loadProxies ( IProxyRegistry storeToModify)
overridevirtual

add proxies to the store to modify (during Begin Event)

IProxyProvider interface add proxies to the store to modify.

Definition at line 137 of file ProxyProviderSvc.cxx.

138 {
139  if (m_providers.empty()) return StatusCode::SUCCESS;
140 
141  StoreID::type storeID = store.storeID();
142  TAdList tList;
143  for (IAddressProvider* provider : m_providers) {
144  ATH_CHECK( provider->loadAddresses(storeID, tList) );
145  setProviderOnList (tList, provider, storeID);
146  }
147  ATH_CHECK( addAddresses (store, tList) );
148  return StatusCode::SUCCESS;
149 }

◆ preLoadProxies()

StatusCode ProxyProviderSvc::preLoadProxies ( IProxyRegistry storeToModify)
overridevirtual

IProxyProvider interface.

IProxyProvider interface add proxies (before Begin Event)

add proxies to the store to modify (before Begin Event)

Definition at line 119 of file ProxyProviderSvc.cxx.

120 {
121  // Due to initialization loops, it's possible for this to be called
122  // before the service is fully initialized. In that case, we may
123  // skip calling some of the providers. So we haven't been fully initialized,
124  // don't do anything now; rather, remember the store, and call
125  // preLoadProxies again for it at the end of initialize().
126  if (FSMState() == Gaudi::StateMachine::OFFLINE) {
127  m_pendingLoad.push_back (&store);
128  return StatusCode::SUCCESS;
129  }
130  return doPreLoadProxies (store);
131 }

◆ providerNamesPropertyHandler()

void ProxyProviderSvc::providerNamesPropertyHandler ( Gaudi::Details::PropertyBase &  theProp)
private

the handler for m_providerNames

Definition at line 287 of file ProxyProviderSvc.cxx.

287  {
288  //add declared providers to the list;
289  std::vector<std::string> providerNames = m_providerNames.value();
290 
291  // FIXME: AddressRemappingSvc needs to come at the end, if it's provided.
292  auto it = std::find (providerNames.begin(), providerNames.end(),
293  "AddressRemappingSvc");
294  if (it != providerNames.end() && it != providerNames.end()-1) {
295  providerNames.erase (it);
296  providerNames.push_back ("AddressRemappingSvc");
297  }
298 
299  for (const std::string& pName : providerNames) {
300  SmartIF<IAddressProvider> pAP{service(pName)};
301  if (!pAP) {
302  ATH_MSG_ERROR(" getting Address Provider "<< pName);
303  throw GaudiException("Failed to locate address provider",
304  "ProxyProviderSvc::providerNamesPropertyHandle",
305  StatusCode::FAILURE);
306  } else {
307  ATH_MSG_DEBUG(" added Address Provider "<< pName);
308  }
310  }
311 
312 }

◆ retrieveProxy()

SG::DataProxy * ProxyProviderSvc::retrieveProxy ( const CLID id,
const std::string &  key,
IProxyRegistry store 
)
overridevirtual

Use a provider to create a proxy for ID/KEY.

If successful, the new proxy will be added to DATASTORE and returned; otherwise, return null.

Definition at line 247 of file ProxyProviderSvc.cxx.

249 {
250  if ( !m_providers.empty() ) {
251  const EventContext& ctx = contextFromStore (store);
252  SG::TransientAddress pTAd (id, key);
253  pAPiterator iProvider(m_providers.begin()), iEnd(m_providers.end());
254  for (; iProvider != iEnd; ++iProvider) {
255  if ( ((*iProvider)->updateAddress(store.storeID(),&pTAd,ctx)).isSuccess() )
256  {
257  pTAd.setProvider(*iProvider, store.storeID());
258  return this->addAddress(store,std::move(pTAd));
259  }
260  }
261  }
262 
263  return nullptr;
264 }

Member Data Documentation

◆ m_pDataLoader

ServiceHandle<IConversionSvc> ProxyProviderSvc::m_pDataLoader
private

Persistency Service.

Definition at line 112 of file ProxyProviderSvc.h.

◆ m_pendingLoad

std::vector<IProxyRegistry*> ProxyProviderSvc::m_pendingLoad
private

List of pending stores on which to run preLoadProxies().

Definition at line 115 of file ProxyProviderSvc.h.

◆ m_providerNames

StringArrayProperty ProxyProviderSvc::m_providerNames
private
Initial value:
{this,"ProviderNames",{},
"names of the services to be use as address providers","OrderedSet<std::string>"}

property: the services declared as providers

Definition at line 102 of file ProxyProviderSvc.h.

◆ m_providers

std::list<IAddressProvider*> ProxyProviderSvc::m_providers
private

the providers we know about. WE DON'T OWN THEM

Definition at line 110 of file ProxyProviderSvc.h.


The documentation for this class was generated from the following files:
SGTest::store
TestStore store
Definition: TestStore.cxx:23
ProxyProviderSvc::pAPiterator
std::list< IAddressProvider * >::iterator pAPiterator
Definition: ProxyProviderSvc.h:44
TileDCSDataPlotter.dp
dp
Definition: TileDCSDataPlotter.py:840
checkxAOD.ds
ds
Definition: Tools/PyUtils/bin/checkxAOD.py:260
StateLessPT_NewConfig.proxy
proxy
Definition: StateLessPT_NewConfig.py:392
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
IProxyRegistry
a proxy registry (a read/write dictionary)
Definition: IProxyRegistry.h:27
ProxyProviderSvc::addProvider
virtual void addProvider(IAddressProvider *aProvider) override final
IAddressProvider manager functionality add a provider to the set of known ones.
Definition: ProxyProviderSvc.h:119
initialize
void initialize()
Definition: run_EoverP.cxx:894
ProxyProviderSvc::m_pendingLoad
std::vector< IProxyRegistry * > m_pendingLoad
List of pending stores on which to run preLoadProxies().
Definition: ProxyProviderSvc.h:115
skel.it
it
Definition: skel.GENtoEVGEN.py:401
ProxyProviderSvc::doPreLoadProxies
StatusCode doPreLoadProxies(IProxyRegistry &storeToModify)
Definition: ProxyProviderSvc.cxx:101
SG::TransientAddress
Definition: TransientAddress.h:32
SGTest::TestStore::proxy_exact
virtual SG::DataProxy * proxy_exact(SG::sgkey_t sgkey) const override
Definition: TestStore.cxx:140
ProxyProviderSvc::m_providerNames
StringArrayProperty m_providerNames
property: the services declared as providers
Definition: ProxyProviderSvc.h:102
SG::TransientAddress::TransientClidSet
std::vector< CLID > TransientClidSet
Strictly a set, but there shouldn't be more than a handful of entries, so store it as a sorted vector...
Definition: TransientAddress.h:38
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
ProxyProviderSvc::addAddresses
StatusCode addAddresses(IProxyRegistry &store, TAdList &tList)
Add lists of TADs to the store.
Definition: ProxyProviderSvc.cxx:157
SG::BaseInfoBase::get_bases
const std::vector< CLID > & get_bases() const
Return the class IDs of all known bases of T (that have class IDs).
Definition: BaseInfo.cxx:304
ProxyProviderSvc::addAddress
SG::DataProxy * addAddress(IProxyRegistry &storeToModify, SG::TransientAddress &&tad)
create a new Proxy, overriding CLID and/or key
Definition: ProxyProviderSvc.cxx:183
SGTest::TestStore::addToStore
virtual StatusCode addToStore(CLID, SG::DataProxy *proxy) override
Definition: TestStore.cxx:176
ProxyProviderSvc::m_pDataLoader
ServiceHandle< IConversionSvc > m_pDataLoader
Persistency Service.
Definition: ProxyProviderSvc.h:112
DiTauMassTools::ignore
void ignore(T &&)
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:58
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ProxyProviderSvc::m_providers
std::list< IAddressProvider * > m_providers
the providers we know about. WE DON'T OWN THEM
Definition: ProxyProviderSvc.h:110
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
COOLRates.alias
alias
Definition: COOLRates.py:1172
master.flag
bool flag
Definition: master.py:29
ClassID_traits
Default, invalid implementation of ClassID_traits.
Definition: Control/AthenaKernel/AthenaKernel/ClassID_traits.h:37
IAddressProvider
interface for IOA providers
Definition: IAddressProvider.h:28
SG::BaseInfoBase::get_copy_conversions
std::vector< CLID > get_copy_conversions() const
Return known copy conversions.
Definition: BaseInfo.cxx:455
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CLID
uint32_t CLID
The Class ID type.
Definition: Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
ProxyProviderSvc::TAdList
std::list< SG::TransientAddress * > TAdList
Definition: ProxyProviderSvc.h:45
StoreID::type
type
Definition: StoreID.h:24
SG::BaseInfoBase
The non-template portion of the BaseInfo implementation.
Definition: Control/AthenaKernel/AthenaKernel/BaseInfo.h:451
ProxyProviderSvc::contextFromStore
const EventContext & contextFromStore(IProxyRegistry &ds) const
Retrieve the EventContext saved in store DS.
Definition: ProxyProviderSvc.cxx:273
SG::DataProxy
Definition: DataProxy.h:45
ProxyProviderSvc::providerNamesPropertyHandler
void providerNamesPropertyHandler(Gaudi::Details::PropertyBase &theProp)
the handler for m_providerNames
Definition: ProxyProviderSvc.cxx:287
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37