All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
HiveWhiteBoard.cpp
Go to the documentation of this file.
1 //====================================================================
2 // WhiteBoard (Concurrent Event Data Store)
3 //--------------------------------------------------------------------
4 //
5 //====================================================================
6 #define WHITEBOARD_CPP
7 
8 // Include files
9 #include "GaudiKernel/Service.h"
10 #include "GaudiKernel/SmartIF.h"
11 #include "GaudiKernel/TypeNameString.h"
12 #include "GaudiKernel/MsgStream.h"
13 #include "GaudiKernel/SvcFactory.h"
14 #include "GaudiKernel/DataObject.h"
15 #include "GaudiKernel/DataSvc.h"
16 #include "GaudiKernel/ThreadLocalPtr.h"
17 #include "tbb/spin_mutex.h"
18 #include "tbb/recursive_mutex.h"
19 
20 
21 //Interfaces
22 #include "GaudiKernel/ISvcLocator.h"
23 #include "GaudiKernel/ISvcManager.h"
24 #include "GaudiKernel/IOpaqueAddress.h"
25 #include "GaudiKernel/IConversionSvc.h"
26 #include "GaudiKernel/IDataManagerSvc.h"
27 #include "GaudiKernel/IAddressCreator.h"
28 #include "GaudiKernel/IDataProviderSvc.h"
29 #include "GaudiKernel/IDataStoreAgent.h"
30 #include "GaudiKernel/IHiveWhiteBoard.h"
31 #include "GaudiKernel/IRegistry.h"
32 
33 // Forward declarations
34 
35 typedef tbb::recursive_mutex wbMutex;
36 //typedef tbb::spin_mutex wbMutex;
37 
38 namespace {
39  struct Partition {
40 
41  SmartIF<IDataProviderSvc> dataProvider;
42  SmartIF<IDataManagerSvc> dataManager;
43  wbMutex storeMutex;
44  std::vector<std::string> newDataObjects;
45  int eventNumber;
46  Partition() : dataProvider(0), dataManager(0), eventNumber(-1) {}
47  Partition(IDataProviderSvc* dp, IDataManagerSvc* dm) : dataProvider(dp), dataManager(dm), eventNumber(-1) {}
48  Partition(const Partition& entry) : dataProvider(entry.dataProvider), dataManager(entry.dataManager), eventNumber(entry.eventNumber) {}
49  Partition& operator=(const Partition& entry) {
50  dataProvider = entry.dataProvider;
51  dataManager = entry.dataManager;
52  return *this;
53  }
54  };
55  class DataAgent : virtual public IDataStoreAgent {
56  private:
57  std::vector<std::string>& m_dataObjects;
58  public:
59  DataAgent(std::vector<std::string>& objs) : m_dataObjects(objs) {}
60  virtual ~DataAgent() {}
61  virtual bool analyse(IRegistry* pReg, int ) {
62  if (0 != pReg->object()) {
63  m_dataObjects.emplace_back(pReg->identifier());
64  return true;
65  }
66  else {
67  return false;
68  }
69  }
70  };
71 }
72 
73 THREAD_LOCAL_PTR Partition* s_current(0);
74 
87 class HiveWhiteBoard: public extends3<Service,
88  IDataProviderSvc,
89  IDataManagerSvc,
90  IHiveWhiteBoard>
91 {
92 protected:
93  typedef std::vector<Partition> Partitions;
94 
98  std::string m_rootName;
100  std::string m_loader;
106  Partitions m_partitions;
108  int m_slots;
113 
114 public:
116  CLID rootCLID() const override {
117  return (CLID)m_rootCLID;
118  }
120  const std::string& rootName() const override {
121  return m_rootName;
122  }
123 
124 // macro to help writing the function calls
125 #define _CALL(P,F,ARGS) if(s_current) { \
126 wbMutex::scoped_lock lock; lock.acquire(s_current->storeMutex);\
127 return s_current->P ? s_current->P->F ARGS : IDataProviderSvc::INVALID_ROOT; }\
128 return IDataProviderSvc::INVALID_ROOT;
129 
131  StatusCode registerAddress(const std::string& path, IOpaqueAddress* pAddr) override {
132  _CALL(dataManager, registerAddress, (path, pAddr));
133  }
135  StatusCode registerAddress(DataObject* parent, const std::string& path, IOpaqueAddress* pAddr) override {
136  _CALL(dataManager, registerAddress, (parent, path, pAddr));
137  }
139  StatusCode registerAddress(IRegistry* parent, const std::string& path, IOpaqueAddress* pAdd) override {
140  _CALL(dataManager, registerAddress, (parent, path, pAdd));
141  }
143  StatusCode unregisterAddress(const std::string& path) override {
144  _CALL(dataManager, unregisterAddress, (path));
145  }
147  StatusCode unregisterAddress(DataObject* pParent, const std::string& path) override {
148  _CALL(dataManager, unregisterAddress, (pParent, path));
149  }
151  StatusCode unregisterAddress(IRegistry* pParent, const std::string& path) override {
152  _CALL(dataManager, unregisterAddress, (pParent, path));
153  }
155  StatusCode objectLeaves(const DataObject* pObject, std::vector<IRegistry*>& leaves) override {
156  _CALL(dataManager, objectLeaves, (pObject, leaves));
157  }
159  StatusCode objectLeaves(const IRegistry* pObject, std::vector<IRegistry*>& leaves) override {
160  _CALL(dataManager, objectLeaves, (pObject, leaves));
161  }
163  StatusCode objectParent(const DataObject* pObject, IRegistry*& refpParent) override {
164  _CALL(dataManager, objectParent, (pObject, refpParent));
165  }
167  StatusCode objectParent(const IRegistry* pObject, IRegistry*& refpParent) override {
168  _CALL(dataManager, objectParent, (pObject, refpParent));
169  }
171  StatusCode clearSubTree(const std::string& path) override {
172  _CALL(dataManager, clearSubTree, (path));
173  }
175  StatusCode clearSubTree(DataObject* pObject) override {
176  _CALL(dataManager, clearSubTree, (pObject));
177  }
179  StatusCode clearStore() override {
180  for(auto& p: m_partitions) p.dataManager->clearStore().ignore();
181  return StatusCode::SUCCESS;
182  }
183 
185  StatusCode traverseSubTree(const std::string& path, IDataStoreAgent* pAgent) override {
186  _CALL(dataManager, traverseSubTree, (path, pAgent));
187  }
189  StatusCode traverseSubTree(DataObject* pObject, IDataStoreAgent* pAgent) override {
190  _CALL(dataManager, traverseSubTree, (pObject, pAgent));
191  }
194  _CALL(dataManager, traverseTree, (pAgent));
195  }
198  StatusCode setRoot(std::string path, DataObject* pObj) override {
199  _CALL(dataManager, setRoot, (path, pObj));
200  }
201 
204  StatusCode setRoot (std::string path, IOpaqueAddress* pAddr) override {
205  _CALL(dataManager, setRoot, (path, pAddr));
206  }
207 
213  IDataProviderSvc* dpsvc __attribute__((unused)) = nullptr) override {
214  if ( 0 != pDataLoader ) pDataLoader->addRef();
215  if ( 0 != m_dataLoader ) m_dataLoader->release();
216  if ( 0 != pDataLoader ) {
217  pDataLoader->setDataProvider(this);
218  }
219  m_dataLoader = pDataLoader;
220  for(auto& p: m_partitions) {
221  p.dataManager->setDataLoader(m_dataLoader,this).ignore();
222  }
223  return SUCCESS;
224  }
227  for(auto& p: m_partitions) p.dataProvider->addPreLoadItem(item);
228  return StatusCode::SUCCESS;
229  }
231  StatusCode addPreLoadItem(const std::string& item) override {
232  for(auto& p: m_partitions) p.dataProvider->addPreLoadItem(item);
233  return StatusCode::SUCCESS;
234  }
237  for(auto& p: m_partitions) p.dataProvider->removePreLoadItem(item);
238  return StatusCode::SUCCESS;
239  }
241  StatusCode removePreLoadItem(const std::string& item) override {
242  for(auto& p: m_partitions) p.dataProvider->removePreLoadItem(item);
243  return StatusCode::SUCCESS;
244  }
247  for(auto& p: m_partitions) p.dataProvider->resetPreLoad();
248  return StatusCode::SUCCESS;
249  }
251  StatusCode preLoad() override {
252  wbMutex::scoped_lock lock; lock.acquire(s_current->storeMutex);
253  StatusCode sc = s_current->dataProvider->preLoad();
254  DataAgent da(s_current->newDataObjects);
255  s_current->dataManager->traverseTree(&da);
256  return sc;
257  }
259  StatusCode registerObject(const std::string& path, DataObject* pObj) override {
260  wbMutex::scoped_lock lock; lock.acquire(s_current->storeMutex);
261  StatusCode sc = s_current->dataProvider->registerObject(path, pObj);
262  if( sc.isSuccess()) {
263  s_current->newDataObjects.push_back(path);
264  }
265  return sc;
266  }
268  StatusCode registerObject(const std::string& parent, const std::string& obj, DataObject* pObj) override {
269  _CALL(dataProvider, registerObject, (parent, obj, pObj));
270  }
272  StatusCode registerObject(const std::string& parent, int item, DataObject* pObj) override {
273  _CALL(dataProvider, registerObject, (parent, item, pObj));
274  }
276  StatusCode registerObject(DataObject* parent, const std::string& obj, DataObject* pObj) override {
277  _CALL(dataProvider, registerObject, (parent, obj, pObj));
278  }
280  StatusCode registerObject(DataObject* parent, int obj, DataObject* pObj) override {
281  _CALL(dataProvider, registerObject, (parent, obj, pObj));
282  }
284  StatusCode unregisterObject(const std::string& path) override {
285  _CALL(dataProvider, unregisterObject, (path));
286  }
288  StatusCode unregisterObject(const std::string& parent, const std::string& obj) override {
289  _CALL(dataProvider, unregisterObject, (parent, obj));
290  }
292  StatusCode unregisterObject(const std::string& parent, int obj) override {
293  _CALL(dataProvider, unregisterObject, (parent, obj));
294  }
297  _CALL(dataProvider, unregisterObject, (pObj));
298  }
300  StatusCode unregisterObject(DataObject* pObj, const std::string& path) override {
301  _CALL(dataProvider, unregisterObject, (pObj, path));
302  }
304  StatusCode unregisterObject(DataObject* pObj, int item ) override {
305  _CALL(dataProvider, unregisterObject, (pObj, item));
306  }
308  StatusCode retrieveObject(IRegistry* parent, const std::string& path, DataObject*& pObj ) override {
309  _CALL(dataProvider, retrieveObject, (parent, path, pObj));
310  }
312  StatusCode retrieveObject(const std::string& path, DataObject*& pObj) override {
313  _CALL(dataProvider, retrieveObject, (path, pObj));
314  }
316  StatusCode retrieveObject(const std::string& parent, const std::string& path, DataObject*& pObj ) override {
317  _CALL(dataProvider, retrieveObject, (parent, path, pObj));
318  }
320  StatusCode retrieveObject(const std::string& parent, int item, DataObject*& pObj) override {
321  _CALL(dataProvider, retrieveObject, (parent, item, pObj));
322  }
324  StatusCode retrieveObject(DataObject* parent, const std::string& path, DataObject*& pObj ) override {
325  _CALL(dataProvider, retrieveObject, (parent, path, pObj));
326  }
328  StatusCode retrieveObject(DataObject* parent, int item, DataObject*& pObj ) override {
329  _CALL(dataProvider, retrieveObject, (parent, item, pObj));
330  }
332  StatusCode findObject(const std::string& path, DataObject*& pObj) override {
333  _CALL(dataProvider, retrieveObject, (path, pObj));
334  }
336  StatusCode findObject(IRegistry* parent, const std::string& path, DataObject*& pObj) override {
337  _CALL(dataProvider, retrieveObject, (parent, path, pObj));
338  }
340  StatusCode findObject(const std::string& parent, const std::string& path, DataObject*& pObj) override {
341  _CALL(dataProvider, retrieveObject, (parent, path, pObj));
342  }
344  StatusCode findObject(const std::string& parent, int item, DataObject*& pObject ) override {
345  _CALL(dataProvider, findObject, (parent, item, pObject));
346  }
348  StatusCode findObject(DataObject* parent, const std::string& path, DataObject*& pObject) override {
349  _CALL(dataProvider, findObject, (parent, path, pObject));
350  }
352  StatusCode findObject(DataObject* parent, int item, DataObject*& pObject) override {
353  _CALL(dataProvider, findObject, (parent, item, pObject));
354  }
356  StatusCode linkObject(IRegistry* from, const std::string& objPath, DataObject* to) override {
357  _CALL(dataProvider, linkObject, (from, objPath, to));
358  }
360  StatusCode linkObject(const std::string& from, const std::string& objPath, DataObject* to) override {
361  _CALL(dataProvider, linkObject, (from, objPath, to));
362  }
364  StatusCode linkObject(DataObject* from, const std::string& objPath, DataObject* to) override {
365  _CALL(dataProvider, linkObject, (from, objPath, to));
366  }
368  StatusCode linkObject(const std::string& fullPath, DataObject* to) override {
369  _CALL(dataProvider, linkObject, (fullPath, to));
370  }
372  StatusCode unlinkObject(IRegistry* from, const std::string& objPath) override {
373  _CALL(dataProvider, unlinkObject, (from, objPath));
374  }
376  StatusCode unlinkObject(const std::string& from, const std::string& objPath) override {
377  _CALL(dataProvider, unlinkObject, (from, objPath));
378  }
380  StatusCode unlinkObject(DataObject* from, const std::string& objPath) override {
381  _CALL(dataProvider, unlinkObject, (from, objPath));
382  }
384  StatusCode unlinkObject(const std::string& path) override {
385  _CALL(dataProvider, unlinkObject, (path));
386  }
388  StatusCode updateObject(IRegistry* pDirectory ) override {
389  _CALL(dataProvider, updateObject, (pDirectory));
390  }
392  StatusCode updateObject(const std::string& path) override {
393  _CALL(dataProvider, updateObject, (path));
394  }
396  StatusCode updateObject(DataObject* pObj ) override {
397  _CALL(dataProvider, updateObject, (pObj));
398  }
400  StatusCode updateObject(const std::string& parent, const std::string& updatePath ) override {
401  _CALL(dataProvider, updateObject, (parent, updatePath));
402  }
404  StatusCode updateObject(DataObject* parent, const std::string& updatePath) override {
405  _CALL(dataProvider, updateObject, (parent, updatePath));
406  }
407 
408  //
409  //---IHiveWhiteBard implemenation--------------------------------------------------
410  //
411 
413  StatusCode clearStore(size_t partition) override {
414  return m_partitions[partition].dataManager->clearStore();
415  }
416 
418  StatusCode selectStore(size_t partition) override {
419  s_current = &m_partitions[partition];
420  return StatusCode::SUCCESS;
421  }
422 
424  StatusCode setNumberOfStores(size_t slots) override {
425  if((int)slots != m_slots and
426  FSMState() == Gaudi::StateMachine::INITIALIZED) {
427  warning() << "Too late to change the number of slots!" << endmsg;
428  return StatusCode::FAILURE;
429  }
430  m_slots = slots;
431  return StatusCode::SUCCESS;
432  }
433 
435  size_t getNumberOfStores() override {
436  return m_slots;
437  }
438 
440  StatusCode getNewDataObjects(std::vector<std::string>& products) override {
441  wbMutex::scoped_lock lock; lock.acquire(s_current->storeMutex);
442  products = s_current->newDataObjects;
443  s_current->newDataObjects.clear();
444  return StatusCode::SUCCESS;
445  }
446 
448  bool newDataObjectsPresent() override {
449  wbMutex::scoped_lock lock; lock.acquire(s_current->storeMutex);
450  return s_current->newDataObjects.size()!=0;
451  }
452 
454  size_t allocateStore( int evtnumber ) override {
455  //size_t free = std::string::npos;
456  size_t index = 0;
457  for (auto& p : m_partitions ) {
458  if( p.eventNumber == evtnumber) {
459  error() << "Attempt to allocate a store partition for an event that is still active" << endmsg;
460  return std::string::npos;
461  } else if (p.eventNumber == -1) {
462  p.eventNumber = evtnumber;
463  //info() << "Got allocated slot..." << index << endmsg;
464  return index;
465  }
466  index++;
467  }
468  return std::string::npos;
469  }
470 
472  StatusCode freeStore( size_t partition ) override {
473  m_partitions[partition].eventNumber = -1;
474  //info() << "Freed slot..." << partition << endmsg;
475  return StatusCode::SUCCESS;
476  }
477 
478 
480  size_t getPartitionNumber(int eventnumber) const override {
481  size_t index{};
482  for (auto& p : m_partitions) {
483  if (p.eventNumber == eventnumber) return index;
484  ++index;
485  }
486  return std::string::npos;
487  }
488 
490  StatusCode sc = service(m_loader, m_addrCreator, true);
491  if (!sc.isSuccess()) {
492  error() << "Failed to retrieve data loader " << "\"" << m_loader << "\"" << endmsg;
493  return sc;
494  }
495  IConversionSvc* dataLoader = 0;
496  sc = service(m_loader, dataLoader, true);
497  if (!sc.isSuccess()) {
498  error() << MSG::ERROR << "Failed to retrieve data loader " << "\"" << m_loader << "\"" << endmsg;
499  return sc;
500  }
501  sc = setDataLoader(dataLoader);
502  dataLoader->release();
503  if (!sc.isSuccess()) {
504  error() << MSG::ERROR << "Failed to set data loader " << "\"" << m_loader << "\"" << endmsg;
505  return sc;
506  }
507  return sc;
508  }
509 
511  if ( m_addrCreator ) m_addrCreator->release();
512  if ( m_dataLoader ) m_dataLoader->release();
513  m_addrCreator = 0;
514  m_dataLoader = 0;
515  return StatusCode::SUCCESS;
516  }
517 
518  //
519  //---IService implemenation---------------------------------------------------------
520  //
521 
523  StatusCode initialize() override {
525  if ( !sc.isSuccess() ) {
526  error() << "Unable to initialize base class" << endmsg;
527  return sc;
528  }
529 
530  if (1 > m_slots ){
531  error() << "Invalid number of slots (" << m_slots << ")" << endmsg;
532  return StatusCode::FAILURE;
533  }
534 
535  for( int i = 0; i< m_slots; i++) {
536  std::ostringstream oss;
537  oss << name() << "_" << i;
538  DataSvc* svc = new DataSvc(oss.str(), serviceLocator());
539  // Percolate properties
540  svc->setProperty("RootCLID", std::to_string(m_rootCLID));
541  svc->setProperty("RootName", m_rootName);
542  svc->setProperty("ForceLeaves", std::to_string(m_forceLeaves));
543  svc->setProperty("EnableFaultHandler", std::to_string(m_enableFaultHdlr));
544 
545  sc = svc->initialize();
546  if (!sc.isSuccess()) {
547  error() << "Failed to instantiate DataSvc as store partition" << endmsg;
548  return sc;
549  }
550  m_partitions.push_back(Partition(svc, svc));
551  }
552  selectStore(0).ignore();
553  return attachServices();
554  }
555 
559  if (!sc.isSuccess()) {
560  error() << "Unable to reinitialize base class" << endmsg;
561  return sc;
562  }
563  detachServices();
564  sc = attachServices();
565  if ( !sc.isSuccess() ) {
566  error() << "Failed to attach necessary services." << endmsg;
567  return sc;
568  }
569  return StatusCode::SUCCESS;
570  }
571 
573  StatusCode finalize() override {
574  setDataLoader(0).ignore();
575  clearStore().ignore();
576  return Service::finalize();
577  }
578 
579 
580 //protected:
581 
583  HiveWhiteBoard( const std::string& name, ISvcLocator* svc )
584  : base_class(name,svc), m_rootCLID(110), m_rootName("/Event"),
585  m_dataLoader(0), m_addrCreator(0)
586  {
587  m_dataLoader = 0;
588  declareProperty("RootCLID", m_rootCLID);
589  declareProperty("RootName", m_rootName);
590  declareProperty("DataLoader", m_loader="EventPersistencySvc");
591  declareProperty("EventSlots", m_slots = 1);
592  declareProperty("ForceLeaves", m_forceLeaves = 1);
593  declareProperty("EnableFaultHandler", m_enableFaultHdlr = 0);
594  }
595 
597  virtual ~HiveWhiteBoard() {
598  setDataLoader(0).ignore();
599  resetPreLoad().ignore();
600  clearStore().ignore();
601 
602  for(Partitions::iterator i = m_partitions.begin(); i != m_partitions.end(); ++i) {
603  (*i).dataManager->release();
604  (*i).dataProvider->release();
605  }
606  m_partitions.clear();
607  }
608 
609 };
610 
611 // Instantiation of a static factory class used by clients to create
612 // instances of this service
StatusCode unlinkObject(const std::string &path) override
Remove a link to another object.
StatusCode unlinkObject(IRegistry *from, const std::string &objPath) override
Remove a link to another object.
StatusCode updateObject(IRegistry *pDirectory) override
Update object identified by its directory entry.
StatusCode retrieveObject(const std::string &parent, const std::string &path, DataObject *&pObj) override
Retrieve object from data store.
StatusCode registerAddress(IRegistry *parent, const std::string &path, IOpaqueAddress *pAdd) override
IDataManagerSvc: Register object address with the data store.
StatusCode linkObject(DataObject *from, const std::string &objPath, DataObject *to) override
Add a link to another object.
#define _CALL(P, F, ARGS)
StatusCode retrieveObject(const std::string &parent, int item, DataObject *&pObj) override
Retrieve object from data store.
StatusCode registerObject(const std::string &path, DataObject *pObj) override
Register object with the data store. (The most common one is the only monitored one for the time bein...
StatusCode initialize() override
Definition: Service.cpp:63
StatusCode registerObject(const std::string &parent, int item, DataObject *pObj) override
Register object with the data store.
StatusCode unregisterObject(DataObject *pObj) override
Unregister object from the data store.
string to_string(const T &value)
Definition: mergesort.cpp:40
#define __attribute__(x)
Definition: System.cpp:70
size_t allocateStore(int evtnumber) override
Allocate a store partition for a given event number.
StatusCode traverseSubTree(const std::string &path, IDataStoreAgent *pAgent) override
Analyze by traversing all data objects below the sub tree.
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition: ISvcLocator.h:25
StatusCode getNewDataObjects(std::vector< std::string > &products) override
Get the list of new DataObjects in the current store.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
StatusCode unregisterAddress(const std::string &path) override
IDataManagerSvc: Unregister object address from the data store.
StatusCode setDataLoader(IConversionSvc *pDataLoader, IDataProviderSvc *dpsvc __attribute__((unused))=nullptr) override
IDataManagerSvc: Pass a default data loader to the service.
StatusCode registerAddress(const std::string &path, IOpaqueAddress *pAddr) override
IDataManagerSvc: Register object address with the data store.
StatusCode finalize() override
Definition: Service.cpp:188
StatusCode retrieveObject(DataObject *parent, const std::string &path, DataObject *&pObj) override
Retrieve object from data store.
StatusCode freeStore(size_t partition) override
Free a store partition.
StatusCode clearStore(size_t partition) override
Remove all data objects in one 'slot' of the data store.
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:76
virtual bool analyse(IRegistry *pObject, int level)=0
Analyse the data object.
StatusCode retrieveObject(const std::string &path, DataObject *&pObj) override
Retrieve object identified by its full path from the data store.
StatusCode registerObject(const std::string &parent, const std::string &obj, DataObject *pObj) override
Register object with the data store.
StatusCode findObject(DataObject *parent, int item, DataObject *&pObject) override
Find object in the data store.
list path
Definition: __init__.py:15
StatusCode unregisterObject(const std::string &parent, const std::string &obj) override
Unregister object from the data store.
IAddressCreator interface definition.
virtual StatusCode setDataProvider(IDataProviderSvc *pService)=0
Set Data provider service.
StatusCode unregisterObject(DataObject *pObj, const std::string &path) override
Unregister object from the data store.
StatusCode resetPreLoad() override
Clear the preload list.
StatusCode addPreLoadItem(const std::string &item) override
Add an item to the preload list.
StatusCode finalize() override
Service initialisation.
StatusCode clearSubTree(DataObject *pObject) override
Remove all data objects below the sub tree identified.
StatusCode clearSubTree(const std::string &path) override
Remove all data objects below the sub tree identified.
StatusCode objectParent(const IRegistry *pObject, IRegistry *&refpParent) override
IDataManagerSvc: Explore the object store: retrieve the object's parent.
StatusCode addPreLoadItem(const DataStoreItem &item) override
Add an item to the preload list.
StatusCode updateObject(DataObject *pObj) override
Update object.
StatusCode registerAddress(DataObject *parent, const std::string &path, IOpaqueAddress *pAddr) override
IDataManagerSvc: Register object address with the data store.
Data provider interface definition.
StatusCode preLoad() override
load all preload items of the list
Description of the DataStoreItem class.
Definition: DataStoreItem.h:17
StatusCode unregisterObject(DataObject *pObj, int item) override
Unregister object from the data store.
StatusCode clearStore() override
IDataManagerSvc: Remove all data objects in the data store.
size_t getPartitionNumber(int eventnumber) const override
Get the partition number corresponding to a given event.
StatusCode selectStore(size_t partition) override
Activate a partition object. The identifies the partition uniquely.
bool m_enableFaultHdlr
Flag to enable interrupts on data creation requests.
tbb::recursive_mutex wbMutex
StatusCode removePreLoadItem(const std::string &item) override
Add an item to the preload list.
std::string m_rootName
Name of root event.
StatusCode detachServices()
StatusCode findObject(DataObject *parent, const std::string &path, DataObject *&pObject) override
Find object in the data store.
std::string m_loader
Data loader name.
StatusCode linkObject(const std::string &from, const std::string &objPath, DataObject *to) override
Add a link to another object.
StatusCode findObject(const std::string &path, DataObject *&pObj) override
Find object identified by its full path in the data store.
StatusCode objectLeaves(const IRegistry *pObject, std::vector< IRegistry * > &leaves) override
Explore the object store: retrieve all leaves attached to the object.
StatusCode updateObject(const std::string &path) override
Update object.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
StatusCode linkObject(const std::string &fullPath, DataObject *to) override
Add a link to another object.
bool m_forceLeaves
Allow forced creation of default leaves on registerObject.
StatusCode unregisterObject(const std::string &path) override
Unregister object from the data store.
def lock(file)
Definition: locker.py:16
CLID rootCLID() const override
IDataManagerSvc: Accessor for root event CLID.
StatusCode updateObject(const std::string &parent, const std::string &updatePath) override
Update object.
StatusCode removePreLoadItem(const DataStoreItem &item) override
Remove an item from the preload list.
bool newDataObjectsPresent() override
Check if new DataObjects are in the current store.
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
StatusCode reinitialize() override
Definition: Service.cpp:283
#define DECLARE_SERVICE_FACTORY(x)
Definition: Service.h:354
CLID m_rootCLID
Integer Property corresponding to CLID of root entry.
StatusCode linkObject(IRegistry *from, const std::string &objPath, DataObject *to) override
Add a link to another object.
StatusCode registerObject(DataObject *parent, int obj, DataObject *pObj) override
Register object with the data store.
StatusCode unlinkObject(DataObject *from, const std::string &objPath) override
Remove a link to another object.
const std::string & rootName() const override
Name for root Event.
virtual DataObject * object() const =0
Retrieve object behind the link.
size_t getNumberOfStores() override
Get the number of event slots (copies of DataSvc objects).
Data service base class.
StatusCode attachServices()
StatusCode traverseSubTree(DataObject *pObject, IDataStoreAgent *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects below the sub tree.
#define THREAD_LOCAL_PTR
StatusCode registerObject(DataObject *parent, const std::string &obj, DataObject *pObj) override
Register object with the data store.
StatusCode objectParent(const DataObject *pObject, IRegistry *&refpParent) override
IDataManagerSvc: Explore the object store: retrieve the object's parent.
StatusCode setRoot(std::string path, IOpaqueAddress *pAddr) override
Initialize data store for new event by giving new event path and address of root object.
Partitions m_partitions
Datastore partitions.
StatusCode findObject(IRegistry *parent, const std::string &path, DataObject *&pObj) override
Find object identified by its full path in the data store.
virtual unsigned long release()=0
Release Interface instance.
IAddressCreator * m_addrCreator
Reference to address creator.
Generic data agent interface.
virtual ~HiveWhiteBoard()
Standard Destructor.
Base class used to extend a class implementing other interfaces.
Definition: extends.h:10
StatusCode initialize() override
Service initialization.
Definition: DataSvc.cpp:1153
StatusCode unregisterAddress(IRegistry *pParent, const std::string &path) override
IDataManagerSvc: Unregister object address from the data store.
HiveWhiteBoard(const std::string &name, ISvcLocator *svc)
Standard Constructor.
StatusCode setRoot(std::string path, DataObject *pObj) override
Initialize data store for new event by giving new event path and root object.
Data service base class.
Definition: DataSvc.h:43
tuple item
print s1,s2
Definition: ana.py:146
StatusCode retrieveObject(DataObject *parent, int item, DataObject *&pObj) override
Retrieve object from data store.
virtual unsigned long addRef()=0
Increment the reference count of Interface instance.
int m_slots
Datastore slots.
StatusCode objectLeaves(const DataObject *pObject, std::vector< IRegistry * > &leaves) override
Explore the object store: retrieve all leaves attached to the object.
StatusCode unregisterObject(const std::string &parent, int obj) override
Unregister object from the data store.
StatusCode initialize() override
Service initialisation.
StatusCode updateObject(DataObject *parent, const std::string &updatePath) override
Update object.
StatusCode findObject(const std::string &parent, const std::string &path, DataObject *&pObj) override
Find object in the data store.
virtual const id_type & identifier() const =0
Full identifier (or key)
StatusCode unlinkObject(const std::string &from, const std::string &objPath) override
Remove a link to another object.
StatusCode traverseTree(IDataStoreAgent *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects in the data store.
Opaque address interface definition.
void ignore() const
Definition: StatusCode.h:108
IConversionSvc * m_dataLoader
Pointer to data loader service.
unsigned int CLID
Class ID definition.
Definition: ClassID.h:8
StatusCode findObject(const std::string &parent, int item, DataObject *&pObject) override
Find object in the data store.
std::vector< Partition > Partitions
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
list i
Definition: ana.py:128
THREAD_LOCAL_PTR Partition * s_current(0)
StatusCode retrieveObject(IRegistry *parent, const std::string &path, DataObject *&pObj) override
Retrieve object from data store.
StatusCode unregisterAddress(DataObject *pParent, const std::string &path) override
IDataManagerSvc: Unregister object address from the data store.
StatusCode reinitialize() override
Service initialisation.
StatusCode setNumberOfStores(size_t slots) override
Set the number of event slots (copies of DataSvc objects).