00001
00002 #ifndef UPDATEMANAGERSVC_H
00003 #define UPDATEMANAGERSVC_H 1
00004
00005
00006 #include "GaudiKernel/Service.h"
00007 #include "GaudiKernel/Time.h"
00008 #include "GaudiKernel/ClassID.h"
00009 #include "GaudiKernel/IOpaqueAddress.h"
00010 #include "GaudiKernel/IIncidentListener.h"
00011 #include "GaudiKernel/MsgStream.h"
00012
00013 #include "GaudiKernel/IUpdateManagerSvc.h"
00014 #include "GaudiKernel/UpdateManagerException.h"
00015
00016 #include "GaudiKernel/Map.h"
00017
00018 #include "GaudiKernel/HashMap.h"
00019
00020 #include <string>
00021 #include <map>
00022 #include <exception>
00023 #include <algorithm>
00024
00025 #ifndef WIN32
00026 #include <pthread.h>
00027 #endif
00028
00029
00030 template <class TYPE> class SvcFactory;
00031 class IIncidentSvc;
00032 class IEventProcessor;
00033 class Condition;
00034
00041 class UpdateManagerSvc: public virtual Service,
00042 public virtual IUpdateManagerSvc,
00043 public virtual IIncidentListener {
00044 public:
00046 UpdateManagerSvc(const std::string& name, ISvcLocator* svcloc);
00047
00048 virtual ~UpdateManagerSvc( );
00049
00054 virtual StatusCode queryInterface(const InterfaceID& riid, void** ppvUnknown);
00055
00057 virtual StatusCode initialize();
00058
00060 virtual StatusCode finalize();
00061
00063 virtual IDataProviderSvc *dataProvider() const;
00065 virtual IDetDataSvc *detDataSvc() const;
00066
00068 virtual StatusCode newEvent();
00072 virtual StatusCode newEvent(const Gaudi::Time &evtTime);
00073
00074
00075
00076 virtual bool getValidity(const std::string path, Gaudi::Time& since, Gaudi::Time &until, bool path_to_db = false);
00077 virtual void setValidity(const std::string path, const Gaudi::Time& since, const Gaudi::Time &until, bool path_to_db = false);
00078
00080 virtual void dump();
00081
00083 virtual void acquireLock();
00085 virtual void releaseLock();
00086
00090 virtual void purge();
00091
00092
00094 virtual void handle(const Incident &inc);
00095
00096 protected:
00097
00099
00100
00102 virtual void i_registerCondition(const std::string &condition, BaseObjectMemberFunction *mf,
00103 BasePtrSetter *ptr_dest = NULL);
00104
00106 virtual void i_registerCondition(void *obj, BaseObjectMemberFunction *mf);
00107
00109 virtual StatusCode i_update(void *instance);
00110
00113 virtual void i_unregister(void *instance);
00114
00116 virtual void i_invalidate(void *instance);
00117
00118 private:
00119
00120 #include "UpdateManagerSvc_Item.icpp"
00121
00123 GaudiUtils::HashMap<std::string, Item*> m_pathMap;
00124
00125 void insertInMap( Item* it ) {
00126 const std::pair<const std::string,Item*> tempS( it->path, it );
00127 m_pathMap.insert( tempS );
00128 }
00129
00131 inline void link(Item* parent, BaseObjectMemberFunction *mf, Item *child);
00132
00133
00134 void unlink(Item *parent, Item *child);
00135
00137 inline Item *findItem(const std::string &path, bool is_path_to_db = false) const;
00138
00140 inline Item *findItem(void *p) const;
00141
00143 inline Item *findItem(BaseObjectMemberFunction *mf) const;
00144
00146 inline void removeFromHead(Item *item);
00147
00149 friend class SvcFactory<UpdateManagerSvc>;
00150
00151
00153 IDataProviderSvc *m_dataProvider;
00154
00156 std::string m_dataProviderName;
00157
00159 std::string m_dataProviderRootName;
00160
00164 IDetDataSvc *m_detDataSvc;
00165
00167 std::string m_detDataSvcName;
00168
00170 IIncidentSvc *m_incidentSvc;
00171
00173 IEventProcessor *m_evtProc;
00174
00176 Item::ItemList m_all_items;
00178 Item::ItemList m_head_items;
00180 Gaudi::Time m_head_since;
00182 Gaudi::Time m_head_until;
00183
00187 std::vector<std::string> m_conditionsOveridesDesc;
00189 GaudiUtils::Map<std::string,Condition*> m_conditionsOverides;
00190
00193 std::string m_diaDumpFile;
00194
00195 #ifndef WIN32
00197 pthread_mutex_t m_busy;
00198 #endif
00199
00200 };
00201
00202 #include "UpdateManagerSvc.icpp"
00203
00204 #endif // UPDATEMANAGERSVC_H