The Gaudi Framework  v30r3 (a5ef0a68)
HiveWhiteBoard.cpp
Go to the documentation of this file.
1 //====================================================================
2 // WhiteBoard (Concurrent Event Data Store)
3 //--------------------------------------------------------------------
4 //
5 //====================================================================
6 // Include files
9 #include "GaudiKernel/DataSvc.h"
10 #include "GaudiKernel/MsgStream.h"
11 #include "GaudiKernel/Service.h"
12 #include "GaudiKernel/SmartIF.h"
14 #include "Rtypes.h"
15 #include "ThreadLocalStorage.h"
16 #include "tbb/concurrent_queue.h"
17 #include "tbb/mutex.h"
18 #include "tbb/recursive_mutex.h"
19 #include <utility>
20 
21 // Interfaces
29 #include "GaudiKernel/IRegistry.h"
32 
33 namespace
34 {
35  struct Partition final {
36  SmartIF<IDataProviderSvc> dataProvider;
37  SmartIF<IDataManagerSvc> dataManager;
38  DataObjIDColl newDataObjects;
39  int eventNumber = -1;
40 
41  // allow acces 'by type' -- used in fwd
42  template <typename T>
43  T* get();
44  };
45  template <>
46  IDataProviderSvc* Partition::get<IDataProviderSvc>()
47  {
48  return dataProvider.get();
49  }
50  template <>
51  IDataManagerSvc* Partition::get<IDataManagerSvc>()
52  {
53  return dataManager.get();
54  }
55 
56  // C++20: replace with http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0290r2.html
57  // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4033.html
58 
59  template <typename T, typename Mutex = tbb::recursive_mutex, typename ReadLock = typename Mutex::scoped_lock,
60  typename WriteLock = ReadLock>
61  class Synced
62  {
63  T m_obj;
64  mutable Mutex m_mtx;
65 
66  public:
67  template <typename F>
68  auto with_lock( F&& f ) -> decltype( auto )
69  {
70  WriteLock lock{m_mtx};
71  return f( m_obj );
72  }
73  template <typename F>
74  auto with_lock( F&& f ) const -> decltype( auto )
75  {
76  ReadLock lock{m_mtx};
77  return f( m_obj );
78  }
79  };
80  // transform an f(T) into an f(Synced<T>)
81  template <typename Fun>
82  auto with_lock( Fun&& f )
83  {
84  return [f = std::forward<Fun>( f )]( auto& p )->decltype( auto ) { return p.with_lock( f ); };
85  }
86  // call f(T) for each element in a container of Synced<T>
87  template <typename ContainerOfSynced, typename Fun>
88  void for_( ContainerOfSynced& c, Fun&& f )
89  {
90  std::for_each( begin( c ), end( c ), with_lock( std::forward<Fun>( f ) ) );
91  }
92 
93  class DataAgent : virtual public IDataStoreAgent
94  {
95  DataObjIDColl& m_dataObjects;
96 
97  public:
98  DataAgent( DataObjIDColl& objs ) : m_dataObjects( objs ) {}
99  bool analyse( IRegistry* pReg, int ) override
100  {
101  if ( !pReg->object() ) return false;
102  m_dataObjects.insert( DataObjID( pReg->identifier() ) );
103  return true;
104  }
105  };
106 }
107 
108 TTHREAD_TLS( Synced<Partition>* ) s_current = nullptr;
109 
110 namespace
111 {
112  namespace detail
113  {
114  template <typename lambda>
115  struct arg_helper : public arg_helper<decltype( &lambda::operator() )> {
116  };
117  template <typename T, typename Ret, typename Arg>
118  struct arg_helper<Ret ( T::* )( Arg ) const> {
119  using type = Arg;
120  };
121 
122  // given a unary lambda whose argument is of type Arg_t,
123  // argument_t<lambda> will be equal to Arg_t
124  template <typename lambda>
125  using argument_t = typename arg_helper<lambda>::type;
126  }
127 
128  template <typename Fun>
129  StatusCode fwd( Fun f )
130  {
131  if ( !s_current ) return IDataProviderSvc::Status::INVALID_ROOT;
132  return s_current->with_lock( [&]( Partition& p ) {
133  auto* svc = p.get<std::decay_t<detail::argument_t<Fun>>>();
134  return svc ? f( *svc ) : IDataProviderSvc::Status::INVALID_ROOT;
135  } );
136  }
137 }
138 
151 class HiveWhiteBoard : public extends<Service, IDataProviderSvc, IDataManagerSvc, IHiveWhiteBoard>
152 {
153 protected:
154  Gaudi::Property<CLID> m_rootCLID{this, "RootCLID", 110 /*CLID_Event*/, "CLID of root entry"};
155  Gaudi::Property<std::string> m_rootName{this, "RootName", "/Event", "name of root entry"};
156  Gaudi::Property<std::string> m_loader{this, "DataLoader", "EventPersistencySvc", ""};
157  Gaudi::Property<size_t> m_slots{this, "EventSlots", 1, "number of event slots"};
158  Gaudi::Property<bool> m_forceLeaves{this, "ForceLeaves", false, "force creation of default leaves on registerObject"};
159  Gaudi::Property<bool> m_enableFaultHdlr{this, "EnableFaultHandler", false,
160  "enable incidents on data creation requests"};
161 
163  IConversionSvc* m_dataLoader = nullptr;
165  IAddressCreator* m_addrCreator = nullptr;
169  tbb::concurrent_queue<size_t> m_freeSlots;
170 
171 public:
173  using extends::extends;
174 
176  ~HiveWhiteBoard() override
177  {
178  setDataLoader( 0 ).ignore();
179  resetPreLoad().ignore();
180  clearStore().ignore();
181  for_( m_partitions, []( Partition& p ) {
182  p.dataManager->release();
183  p.dataProvider->release();
184  } );
185  m_partitions.clear();
186  }
187 
189  size_t freeSlots() override { return m_freeSlots.unsafe_size(); }
190 
192  CLID rootCLID() const override { return (CLID)m_rootCLID; }
194  const std::string& rootName() const override { return m_rootName; }
195 
197  StatusCode registerAddress( boost::string_ref path, IOpaqueAddress* pAddr ) override
198  {
199  return fwd( [&]( IDataManagerSvc& p ) { return p.registerAddress( path, pAddr ); } );
200  }
202  StatusCode registerAddress( DataObject* parent, boost::string_ref path, IOpaqueAddress* pAddr ) override
203  {
204  return fwd( [&]( IDataManagerSvc& p ) { return p.registerAddress( parent, path, pAddr ); } );
205  }
207  StatusCode registerAddress( IRegistry* parent, boost::string_ref path, IOpaqueAddress* pAdd ) override
208  {
209  return fwd( [&]( IDataManagerSvc& p ) { return p.registerAddress( parent, path, pAdd ); } );
210  }
212  StatusCode unregisterAddress( boost::string_ref path ) override
213  {
214  return fwd( [&]( IDataManagerSvc& p ) { return p.unregisterAddress( path ); } );
215  }
217  StatusCode unregisterAddress( DataObject* pParent, boost::string_ref path ) override
218  {
219  return fwd( [&]( IDataManagerSvc& p ) { return p.unregisterAddress( pParent, path ); } );
220  }
222  StatusCode unregisterAddress( IRegistry* pParent, boost::string_ref path ) override
223  {
224  return fwd( [&]( IDataManagerSvc& p ) { return p.unregisterAddress( pParent, path ); } );
225  }
227  StatusCode objectLeaves( const DataObject* pObject, std::vector<IRegistry*>& leaves ) override
228  {
229  return fwd( [&]( IDataManagerSvc& p ) { return p.objectLeaves( pObject, leaves ); } );
230  }
232  StatusCode objectLeaves( const IRegistry* pObject, std::vector<IRegistry*>& leaves ) override
233  {
234  return fwd( [&]( IDataManagerSvc& p ) { return p.objectLeaves( pObject, leaves ); } );
235  }
237  StatusCode objectParent( const DataObject* pObject, IRegistry*& refpParent ) override
238  {
239  return fwd( [&]( IDataManagerSvc& p ) { return p.objectParent( pObject, refpParent ); } );
240  }
242  StatusCode objectParent( const IRegistry* pObject, IRegistry*& refpParent ) override
243  {
244  return fwd( [&]( IDataManagerSvc& p ) { return p.objectParent( pObject, refpParent ); } );
245  }
247  StatusCode clearSubTree( boost::string_ref path ) override
248  {
249  return fwd( [&]( IDataManagerSvc& p ) { return p.clearSubTree( path ); } );
250  }
252  StatusCode clearSubTree( DataObject* pObject ) override
253  {
254  return fwd( [&]( IDataManagerSvc& p ) { return p.clearSubTree( pObject ); } );
255  }
258  {
259  for_( m_partitions, []( Partition& p ) { p.dataManager->clearStore().ignore(); } );
260  return StatusCode::SUCCESS;
261  }
262 
264  StatusCode traverseSubTree( boost::string_ref path, IDataStoreAgent* pAgent ) override
265  {
266  return fwd( [&]( IDataManagerSvc& p ) { return p.traverseSubTree( path, pAgent ); } );
267  }
269  StatusCode traverseSubTree( DataObject* pObject, IDataStoreAgent* pAgent ) override
270  {
271  return fwd( [&]( IDataManagerSvc& p ) { return p.traverseSubTree( pObject, pAgent ); } );
272  }
275  {
276  return fwd( [&]( IDataManagerSvc& p ) { return p.traverseTree( pAgent ); } );
277  }
281  {
282  return fwd(
283  [ pObj, path = std::move( path ) ]( IDataManagerSvc & p ) { return p.setRoot( std::move( path ), pObj ); } );
284  }
285 
289  {
290  return fwd(
291  [ pAddr, path = std::move( path ) ]( IDataManagerSvc & p ) { return p.setRoot( std::move( path ), pAddr ); } );
292  }
293 
299  IDataProviderSvc* dpsvc __attribute__( ( unused ) ) = nullptr ) override
300  {
301  if ( pDataLoader ) pDataLoader->addRef();
302  if ( m_dataLoader ) m_dataLoader->release();
303  if ( pDataLoader ) pDataLoader->setDataProvider( this );
304  m_dataLoader = pDataLoader;
305  for_( m_partitions, [&]( Partition& p ) { p.dataManager->setDataLoader( m_dataLoader, this ).ignore(); } );
306  return StatusCode::SUCCESS;
307  }
309  StatusCode addPreLoadItem( const DataStoreItem& item ) override
310  {
311  for_( m_partitions, [&]( Partition& p ) { p.dataProvider->addPreLoadItem( item ); } );
312  return StatusCode::SUCCESS;
313  }
316  {
317  for_( m_partitions, [&]( Partition& p ) { p.dataProvider->addPreLoadItem( item ); } );
318  return StatusCode::SUCCESS;
319  }
322  {
323  for_( m_partitions, [&]( Partition& p ) { p.dataProvider->removePreLoadItem( item ); } );
324  return StatusCode::SUCCESS;
325  }
328  {
329  for_( m_partitions, [&]( Partition& p ) { p.dataProvider->removePreLoadItem( item ); } );
330  return StatusCode::SUCCESS;
331  }
334  {
335  for_( m_partitions, [&]( Partition& p ) { p.dataProvider->resetPreLoad(); } );
336  return StatusCode::SUCCESS;
337  }
339  StatusCode preLoad() override
340  {
341  return s_current->with_lock( []( Partition& p ) {
342  StatusCode sc = p.dataProvider->preLoad();
343  DataAgent da( p.newDataObjects );
344  p.dataManager->traverseTree( &da );
345  return sc;
346  } );
347  }
349  StatusCode registerObject( boost::string_ref path, DataObject* pObj ) override
350  {
351  return s_current->with_lock( [&]( Partition& p ) {
352  StatusCode sc = p.dataProvider->registerObject( path, pObj );
353  if ( sc.isSuccess() ) {
354  p.newDataObjects.insert( DataObjID( std::string{path.data(), path.size()} ) );
355  }
356  return sc;
357  } );
358  }
360  StatusCode registerObject( boost::string_ref parent, boost::string_ref obj, DataObject* pObj ) override
361  {
362  return fwd( [&]( IDataProviderSvc& p ) { return p.registerObject( parent, obj, pObj ); } );
363  }
365  StatusCode registerObject( boost::string_ref parent, int item, DataObject* pObj ) override
366  {
367  return fwd( [&]( IDataProviderSvc& p ) { return p.registerObject( parent, item, pObj ); } );
368  }
370  StatusCode registerObject( DataObject* parent, boost::string_ref obj, DataObject* pObj ) override
371  {
372  return fwd( [&]( IDataProviderSvc& p ) { return p.registerObject( parent, obj, pObj ); } );
373  }
375  StatusCode registerObject( DataObject* parent, int obj, DataObject* pObj ) override
376  {
377  return fwd( [&]( IDataProviderSvc& p ) { return p.registerObject( parent, obj, pObj ); } );
378  }
380  StatusCode unregisterObject( boost::string_ref path ) override
381  {
382  return fwd( [&]( IDataProviderSvc& p ) { return p.unregisterObject( path ); } );
383  }
385  StatusCode unregisterObject( boost::string_ref parent, boost::string_ref obj ) override
386  {
387  return fwd( [&]( IDataProviderSvc& p ) { return p.unregisterObject( parent, obj ); } );
388  }
390  StatusCode unregisterObject( boost::string_ref parent, int obj ) override
391  {
392  return fwd( [&]( IDataProviderSvc& p ) { return p.unregisterObject( parent, obj ); } );
393  }
396  {
397  return fwd( [&]( IDataProviderSvc& p ) { return p.unregisterObject( pObj ); } );
398  }
400  StatusCode unregisterObject( DataObject* pObj, boost::string_ref path ) override
401  {
402  return fwd( [&]( IDataProviderSvc& p ) { return p.unregisterObject( pObj, path ); } );
403  }
405  StatusCode unregisterObject( DataObject* pObj, int item ) override
406  {
407  return fwd( [&]( IDataProviderSvc& p ) { return p.unregisterObject( pObj, item ); } );
408  }
410  StatusCode retrieveObject( IRegistry* parent, boost::string_ref path, DataObject*& pObj ) override
411  {
412  return fwd( [&]( IDataProviderSvc& p ) { return p.retrieveObject( parent, path, pObj ); } );
413  }
415  StatusCode retrieveObject( boost::string_ref path, DataObject*& pObj ) override
416  {
417  return fwd( [&]( IDataProviderSvc& p ) { return p.retrieveObject( path, pObj ); } );
418  }
420  StatusCode retrieveObject( boost::string_ref parent, boost::string_ref path, DataObject*& pObj ) override
421  {
422  return fwd( [&]( IDataProviderSvc& p ) { return p.retrieveObject( parent, path, pObj ); } );
423  }
425  StatusCode retrieveObject( boost::string_ref parent, int item, DataObject*& pObj ) override
426  {
427  return fwd( [&]( IDataProviderSvc& p ) { return p.retrieveObject( parent, item, pObj ); } );
428  }
430  StatusCode retrieveObject( DataObject* parent, boost::string_ref path, DataObject*& pObj ) override
431  {
432  return fwd( [&]( IDataProviderSvc& p ) { return p.retrieveObject( parent, path, pObj ); } );
433  }
435  StatusCode retrieveObject( DataObject* parent, int item, DataObject*& pObj ) override
436  {
437  return fwd( [&]( IDataProviderSvc& p ) { return p.retrieveObject( parent, item, pObj ); } );
438  }
440  StatusCode findObject( boost::string_ref path, DataObject*& pObj ) override
441  {
442  return fwd( [&]( IDataProviderSvc& p ) { return p.retrieveObject( path, pObj ); } );
443  }
445  StatusCode findObject( IRegistry* parent, boost::string_ref path, DataObject*& pObj ) override
446  {
447  return fwd( [&]( IDataProviderSvc& p ) { return p.retrieveObject( parent, path, pObj ); } );
448  }
450  StatusCode findObject( boost::string_ref parent, boost::string_ref path, DataObject*& pObj ) override
451  {
452  return fwd( [&]( IDataProviderSvc& p ) { return p.retrieveObject( parent, path, pObj ); } );
453  }
455  StatusCode findObject( boost::string_ref parent, int item, DataObject*& pObject ) override
456  {
457  return fwd( [&]( IDataProviderSvc& p ) { return p.findObject( parent, item, pObject ); } );
458  }
460  StatusCode findObject( DataObject* parent, boost::string_ref path, DataObject*& pObject ) override
461  {
462  return fwd( [&]( IDataProviderSvc& p ) { return p.findObject( parent, path, pObject ); } );
463  }
465  StatusCode findObject( DataObject* parent, int item, DataObject*& pObject ) override
466  {
467  return fwd( [&]( IDataProviderSvc& p ) { return p.findObject( parent, item, pObject ); } );
468  }
470  StatusCode linkObject( IRegistry* from, boost::string_ref objPath, DataObject* to ) override
471  {
472  return fwd( [&]( IDataProviderSvc& p ) { return p.linkObject( from, objPath, to ); } );
473  }
475  StatusCode linkObject( boost::string_ref from, boost::string_ref objPath, DataObject* to ) override
476  {
477  return fwd( [&]( IDataProviderSvc& p ) { return p.linkObject( from, objPath, to ); } );
478  }
480  StatusCode linkObject( DataObject* from, boost::string_ref objPath, DataObject* to ) override
481  {
482  return fwd( [&]( IDataProviderSvc& p ) { return p.linkObject( from, objPath, to ); } );
483  }
485  StatusCode linkObject( boost::string_ref fullPath, DataObject* to ) override
486  {
487  return fwd( [&]( IDataProviderSvc& p ) { return p.linkObject( fullPath, to ); } );
488  }
490  StatusCode unlinkObject( IRegistry* from, boost::string_ref objPath ) override
491  {
492  return fwd( [&]( IDataProviderSvc& p ) { return p.unlinkObject( from, objPath ); } );
493  }
495  StatusCode unlinkObject( boost::string_ref from, boost::string_ref objPath ) override
496  {
497  return fwd( [&]( IDataProviderSvc& p ) { return p.unlinkObject( from, objPath ); } );
498  }
500  StatusCode unlinkObject( DataObject* from, boost::string_ref objPath ) override
501  {
502  return fwd( [&]( IDataProviderSvc& p ) { return p.unlinkObject( from, objPath ); } );
503  }
505  StatusCode unlinkObject( boost::string_ref path ) override
506  {
507  return fwd( [&]( IDataProviderSvc& p ) { return p.unlinkObject( path ); } );
508  }
510  StatusCode updateObject( IRegistry* pDirectory ) override
511  {
512  return fwd( [&]( IDataProviderSvc& p ) { return p.updateObject( pDirectory ); } );
513  }
515  StatusCode updateObject( boost::string_ref path ) override
516  {
517  return fwd( [&]( IDataProviderSvc& p ) { return p.updateObject( path ); } );
518  }
521  {
522  return fwd( [&]( IDataProviderSvc& p ) { return p.updateObject( pObj ); } );
523  }
525  StatusCode updateObject( boost::string_ref parent, boost::string_ref updatePath ) override
526  {
527  return fwd( [&]( IDataProviderSvc& p ) { return p.updateObject( parent, updatePath ); } );
528  }
530  StatusCode updateObject( DataObject* parent, boost::string_ref updatePath ) override
531  {
532  return fwd( [&]( IDataProviderSvc& p ) { return p.updateObject( parent, updatePath ); } );
533  }
534 
535  //
536  //---IHiveWhiteBard implemenation--------------------------------------------------
537  //
538 
540  StatusCode clearStore( size_t partition ) override
541  {
542  return m_partitions[partition].with_lock( []( Partition& p ) { return p.dataManager->clearStore(); } );
543  }
544 
546  StatusCode selectStore( size_t partition ) override
547  {
548  s_current = &m_partitions[partition];
549  return StatusCode::SUCCESS;
550  }
551 
553  StatusCode setNumberOfStores( size_t slots ) override
554  {
555  if ( slots != m_slots && FSMState() == Gaudi::StateMachine::INITIALIZED ) {
556  warning() << "Too late to change the number of slots!" << endmsg;
557  return StatusCode::FAILURE;
558  }
559  m_slots = slots;
560  return StatusCode::SUCCESS;
561  }
562 
564  size_t getNumberOfStores() const override { return m_slots; }
565 
568  {
569  return s_current->with_lock( [&]( Partition& p ) { return std::exchange( p.newDataObjects, {} ); } );
570  }
571 
573  void addNewDataObjects( DataObjIDColl& products ) override
574  {
575  s_current->with_lock( [&]( Partition& p ) { p.newDataObjects.insert( begin( products ), end( products ) ); } );
576  }
577 
579  bool exists( const DataObjID& id ) override
580  {
581  DataObject* pObject{nullptr};
582  return findObject( id.fullKey(), pObject ).isSuccess();
583  }
584 
586  size_t allocateStore( int evtnumber ) override
587  {
588  // take next free slot in the list
589  size_t slot = std::string::npos;
590  if ( m_freeSlots.try_pop( slot ) ) {
591  assert( slot != std::string::npos );
592  assert( slot < m_partitions.size() );
593  m_partitions[slot].with_lock( [evtnumber]( Partition& p ) {
594  assert( p.eventNumber == -1 ); // or whatever value represents 'free'
595  p.eventNumber = evtnumber;
596  } );
597  }
598  return slot;
599  }
600 
602  StatusCode freeStore( size_t partition ) override
603  {
604  assert( partition < m_partitions.size() );
605  m_partitions[partition].with_lock( []( Partition& p ) { p.eventNumber = -1; } );
606  m_freeSlots.push( partition );
607  return StatusCode::SUCCESS;
608  }
609 
611  size_t getPartitionNumber( int eventnumber ) const override
612  {
613  auto i = std::find_if( begin( m_partitions ), end( m_partitions ),
614  with_lock( [eventnumber]( const Partition& p ) { return p.eventNumber == eventnumber; } ) );
615  return i != end( m_partitions ) ? std::distance( begin( m_partitions ), i ) : std::string::npos;
616  }
617 
619  {
620  StatusCode sc = service( m_loader, m_addrCreator, true );
621  if ( !sc.isSuccess() ) {
622  error() << "Failed to retrieve data loader "
623  << "\"" << m_loader << "\"" << endmsg;
624  return sc;
625  }
626  IConversionSvc* dataLoader = nullptr;
627  sc = service( m_loader, dataLoader, true );
628  if ( !sc.isSuccess() ) {
629  error() << MSG::ERROR << "Failed to retrieve data loader "
630  << "\"" << m_loader << "\"" << endmsg;
631  return sc;
632  }
633  sc = setDataLoader( dataLoader );
634  dataLoader->release();
635  if ( !sc.isSuccess() ) {
636  error() << MSG::ERROR << "Failed to set data loader "
637  << "\"" << m_loader << "\"" << endmsg;
638  return sc;
639  }
640  return sc;
641  }
642 
644  {
645  if ( m_addrCreator ) m_addrCreator->release();
646  if ( m_dataLoader ) m_dataLoader->release();
647  m_addrCreator = nullptr;
648  m_dataLoader = nullptr;
649  return StatusCode::SUCCESS;
650  }
651 
652  //
653  //---IService implemenation---------------------------------------------------------
654  //
655 
658  {
660  if ( !sc.isSuccess() ) {
661  error() << "Unable to initialize base class" << endmsg;
662  return sc;
663  }
664  if ( m_slots < (size_t)1 ) {
665  error() << "Invalid number of slots (" << m_slots << ")" << endmsg;
666  return StatusCode::FAILURE;
667  }
668 
669  m_partitions = std::vector<Synced<Partition>>( m_slots );
670  for ( size_t i = 0; i < m_slots; i++ ) {
671  DataSvc* svc = new DataSvc( name() + "_" + std::to_string( i ), serviceLocator() );
672  // Percolate properties
673  svc->setProperty( m_rootCLID ).ignore();
674  svc->setProperty( m_rootName ).ignore();
675  svc->setProperty( m_forceLeaves ).ignore();
676  svc->setProperty( m_enableFaultHdlr ).ignore();
677  // make sure that CommonMessaging is initialized
678  svc->setProperty( m_outputLevel ).ignore();
679 
680  sc = svc->initialize();
681  if ( !sc.isSuccess() ) {
682  error() << "Failed to instantiate DataSvc as store partition" << endmsg;
683  return sc;
684  }
685  m_partitions[i].with_lock( [&]( Partition& p ) {
686  p.dataProvider = svc;
687  p.dataManager = svc;
688  } );
689  m_freeSlots.push( i );
690  }
691  selectStore( 0 ).ignore();
692  return attachServices();
693  }
694 
697  {
699  if ( !sc.isSuccess() ) {
700  error() << "Unable to reinitialize base class" << endmsg;
701  return sc;
702  }
703  detachServices();
704  sc = attachServices();
705  if ( !sc.isSuccess() ) {
706  error() << "Failed to attach necessary services." << endmsg;
707  return sc;
708  }
709  return StatusCode::SUCCESS;
710  }
711 
713  StatusCode finalize() override
714  {
715  setDataLoader( 0 ).ignore();
716  clearStore().ignore();
717  return Service::finalize();
718  }
719 };
720 
721 // Instantiation of a static factory class used by clients to create
722 // instances of this service
virtual StatusCode traverseTree(IDataStoreAgent *pAgent)=0
Analyse by traversing all data objects in the data store.
StatusCode updateObject(IRegistry *pDirectory) override
Update object identified by its directory entry.
constexpr static const auto FAILURE
Definition: StatusCode.h:88
StatusCode initialize() override
Definition: Service.cpp:63
StatusCode unregisterObject(DataObject *pObj) override
Unregister object from the data store.
#define __attribute__(x)
Definition: System.cpp:89
size_t allocateStore(int evtnumber) override
Allocate a store partition for a given event number.
virtual StatusCode objectLeaves(const DataObject *pObject, std::vector< IRegistry * > &refLeaves)=0
Explore the object store: retrieve all leaves attached to the object The object is identified by its ...
StatusCode findObject(boost::string_ref parent, int item, DataObject *&pObject) override
Find object in the data store.
virtual StatusCode unlinkObject(IRegistry *from, boost::string_ref objPath)=0
Remove a link to another object.
T distance(T...args)
StatusCode updateObject(boost::string_ref parent, boost::string_ref updatePath) override
Update object.
StatusCode setDataLoader(IConversionSvc *pDataLoader, IDataProviderSvc *dpsvc __attribute__((unused))=nullptr) override
IDataManagerSvc: Pass a default data loader to the service.
StatusCode finalize() override
Definition: Service.cpp:173
StatusCode linkObject(boost::string_ref fullPath, DataObject *to) override
Add a link to another object.
Implementation of property with value of concrete type.
Definition: Property.h:381
StatusCode setProperty(const Gaudi::Details::PropertyBase &p) override
set the property form another property
StatusCode freeStore(size_t partition) override
Free a store partition.
DataObjIDColl getNewDataObjects() override
Get the list of new DataObjects in the current store.
StatusCode unlinkObject(IRegistry *from, boost::string_ref objPath) override
Remove a link to another object.
size_t getPartitionNumber(int eventnumber) const override
Get the partition number corresponding to a given event.
StatusCode clearStore(size_t partition) override
Remove all data objects in one &#39;slot&#39; of the data store.
StatusCode registerObject(boost::string_ref path, DataObject *pObj) override
Register object with the data store. (The most common one is the only monitored one for the time bein...
virtual StatusCode findObject(IRegistry *pDirectory, boost::string_ref path, DataObject *&pObject)=0
Find object identified by its directory entry.
StatusCode retrieveObject(boost::string_ref path, DataObject *&pObj) override
Retrieve object identified by its full path from the data store.
bool isSuccess() const
Definition: StatusCode.h:287
StatusCode registerAddress(boost::string_ref path, IOpaqueAddress *pAddr) override
IDataManagerSvc: Register object address with the data store.
virtual StatusCode setRoot(std::string root_name, DataObject *pObject)=0
Initialize data store for new event by giving new event path.
StatusCode retrieveObject(DataObject *parent, boost::string_ref path, DataObject *&pObj) override
Retrieve object from data store.
StatusCode findObject(DataObject *parent, int item, DataObject *&pObject) override
Find object in the data store.
T to_string(T...args)
IAddressCreator interface definition.
StatusCode unlinkObject(boost::string_ref path) override
Remove a link to another object.
virtual StatusCode setDataProvider(IDataProviderSvc *pService)=0
Set Data provider service.
StatusCode findObject(IRegistry *parent, boost::string_ref path, DataObject *&pObj) override
Find object identified by its full path in the data store.
StatusCode unregisterAddress(boost::string_ref path) override
IDataManagerSvc: Unregister object address from the data store.
StatusCode resetPreLoad() override
Clear the preload list.
StatusCode finalize() override
Service initialisation.
StatusCode clearSubTree(DataObject *pObject) override
Remove all data objects below the sub tree identified.
size_t getNumberOfStores() const override
Get the number of event slots (copies of DataSvc objects).
StatusCode objectParent(const IRegistry *pObject, IRegistry *&refpParent) override
IDataManagerSvc: Explore the object store: retrieve the object&#39;s parent.
StatusCode linkObject(DataObject *from, boost::string_ref objPath, DataObject *to) override
Add a link to another object.
StatusCode addPreLoadItem(const DataStoreItem &item) override
Add an item to the preload list.
StatusCode updateObject(DataObject *pObj) override
Update object.
std::vector< Synced< Partition > > m_partitions
Datastore partitions.
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 unlinkObject(DataObject *from, boost::string_ref objPath) override
Remove a link to another object.
size_t freeSlots() override
Get free slots number.
virtual StatusCode objectParent(const DataObject *pObject, IRegistry *&refpParent)=0
IDataManagerSvc: Explore the object store: retrieve the object&#39;s parent.
StatusCode clearStore() override
IDataManagerSvc: Remove all data objects in the data store.
StatusCode unregisterObject(boost::string_ref parent, boost::string_ref obj) override
Unregister object from the data store.
StatusCode selectStore(size_t partition) override
Activate a partition object. The identifies the partition uniquely.
Invalid root path object cannot be retrieved or stored.
STL class.
virtual StatusCode linkObject(IRegistry *from, boost::string_ref objPath, DataObject *toObj)=0
Add a link to another object.
#define DECLARE_COMPONENT(type)
virtual StatusCode traverseSubTree(boost::string_ref sub_path, IDataStoreAgent *pAgent)=0
Analyse by traversing all data objects below the sub tree identified by its full path name...
T data(T...args)
StatusCode detachServices()
TupleObj.h GaudiAlg/TupleObj.h namespace with few technical implementations.
StatusCode unregisterAddress(IRegistry *pParent, boost::string_ref path) override
IDataManagerSvc: Unregister object address from the data store.
virtual const id_type & identifier() const =0
Full identifier (or key)
StatusCode objectLeaves(const IRegistry *pObject, std::vector< IRegistry * > &leaves) override
Explore the object store: retrieve all leaves attached to the object.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
typename arg_helper< lambda >::type argument_t
Definition: EventIDBase.h:35
virtual StatusCode updateObject(IRegistry *pDirectory)=0
Update object identified by its directory entry.
StatusCode removePreLoadItem(std::string item) override
Add an item to the preload list.
StatusCode addPreLoadItem(std::string item) override
Add an item to the preload list.
StatusCode retrieveObject(boost::string_ref parent, int item, DataObject *&pObj) override
Retrieve object from data store.
StatusCode linkObject(IRegistry *from, boost::string_ref objPath, DataObject *to) override
Add a link to another object.
StatusCode unregisterObject(boost::string_ref path) override
Unregister object from the data store.
T lock(T...args)
StatusCode removePreLoadItem(const DataStoreItem &item) override
Remove an item from the preload list.
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:249
StatusCode traverseSubTree(boost::string_ref path, IDataStoreAgent *pAgent) override
Analyze by traversing all data objects below the sub tree.
virtual StatusCode retrieveObject(IRegistry *pDirectory, boost::string_ref path, DataObject *&pObject)=0
Retrieve object identified by its directory entry.
unsigned int CLID
Class ID definition.
Definition: ClassID.h:8
StatusCode registerObject(DataObject *parent, int obj, DataObject *pObj) override
Register object with the data store.
virtual StatusCode clearSubTree(boost::string_ref sub_path)=0
Remove all data objects below the sub tree identified by its full path name.
T clear(T...args)
StatusCode clearSubTree(boost::string_ref path) override
Remove all data objects below the sub tree identified.
T move(T...args)
Data service base class.
StatusCode unlinkObject(boost::string_ref from, boost::string_ref objPath) override
Remove a link to another object.
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
virtual DataObject * object() const =0
Retrieve object behind the link.
TTHREAD_TLS(Synced< Partition > *) s_current
StatusCode findObject(boost::string_ref parent, boost::string_ref path, DataObject *&pObj) override
Find object in the data store.
StatusCode attachServices()
StatusCode traverseSubTree(DataObject *pObject, IDataStoreAgent *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects below the sub tree.
T insert(T...args)
virtual StatusCode unregisterAddress(boost::string_ref fullPath)=0
Unregister object address from the data store.
T find_if(T...args)
T size(T...args)
virtual StatusCode unregisterObject(boost::string_ref fullPath)=0
Unregister object from the data store.
StatusCode registerObject(boost::string_ref parent, int item, 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&#39;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.
STL class.
virtual unsigned long release()=0
Release Interface instance.
Generic data agent interface.
Base class used to extend a class implementing other interfaces.
Definition: extends.h:10
StatusCode initialize() override
Service initialization.
Definition: DataSvc.cpp:1086
StatusCode unregisterObject(DataObject *pObj, boost::string_ref path) override
Unregister object from the data store.
virtual StatusCode registerObject(boost::string_ref fullPath, DataObject *pObject)=0
Register object with the data store.
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:165
StatusCode setRoot(std::string path, DataObject *pObj) override
Initialize data store for new event by giving new event path and root object.
CLID rootCLID() const override
IDataManagerSvc: Accessor for root event CLID.
Data service base class.
Definition: DataSvc.h:44
virtual StatusCode registerAddress(boost::string_ref fullPath, IOpaqueAddress *pAddress)=0
Register object address with the data store.
StatusCode registerAddress(IRegistry *parent, boost::string_ref path, IOpaqueAddress *pAdd) override
IDataManagerSvc: Register object address with the data store.
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.
StatusCode unregisterObject(boost::string_ref parent, int obj) override
Unregister object from the data store.
StatusCode objectLeaves(const DataObject *pObject, std::vector< IRegistry * > &leaves) override
Explore the object store: retrieve all leaves attached to the object.
StatusCode registerObject(DataObject *parent, boost::string_ref obj, DataObject *pObj) override
Register object with the data store.
StatusCode initialize() override
Service initialisation.
StatusCode linkObject(boost::string_ref from, boost::string_ref objPath, DataObject *to) override
Add a link to another object.
StatusCode updateObject(boost::string_ref path) override
Update object.
StatusCode traverseTree(IDataStoreAgent *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects in the data store.
AttribStringParser::Iterator begin(const AttribStringParser &parser)
void addNewDataObjects(DataObjIDColl &products) override
add to the list of new DataObjects in the current store.
StatusCode findObject(boost::string_ref path, DataObject *&pObj) override
Find object identified by its full path in the data store.
Opaque address interface definition.
StatusCode findObject(DataObject *parent, boost::string_ref path, DataObject *&pObject) override
Find object in the data store.
StatusCode registerObject(boost::string_ref parent, boost::string_ref obj, DataObject *pObj) override
Register object with the data store.
StatusCode retrieveObject(boost::string_ref parent, boost::string_ref path, DataObject *&pObj) override
Retrieve object from data store.
T for_each(T...args)
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
tbb::concurrent_queue< size_t > m_freeSlots
fifo queue of free slots
StatusCode updateObject(DataObject *parent, boost::string_ref updatePath) override
Update object.
StatusCode unregisterAddress(DataObject *pParent, boost::string_ref path) override
IDataManagerSvc: Unregister object address from the data store.
bool exists(const DataObjID &id) override
check if a data object exists in the current store
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
const std::string & rootName() const override
Name for root Event.
StatusCode reinitialize() override
Service initialisation.
StatusCode retrieveObject(IRegistry *parent, boost::string_ref path, DataObject *&pObj) override
Retrieve object from data store.
StatusCode setNumberOfStores(size_t slots) override
Set the number of event slots (copies of DataSvc objects).
~HiveWhiteBoard() override
Standard Destructor.
StatusCode registerAddress(DataObject *parent, boost::string_ref path, IOpaqueAddress *pAddr) override
IDataManagerSvc: Register object address with the data store.