This is Unofficial EPICS BASE Doxygen Site
pvDatabase.h
Go to the documentation of this file.
1 
6 #ifndef PVDATABASE_H
7 #define PVDATABASE_H
8 
9 #include <list>
10 #include <map>
11 
12 #include <pv/pvData.h>
13 #include <pv/pvTimeStamp.h>
14 #include <pv/rpcService.h>
15 #include <pv/pvStructureCopy.h>
16 
17 #include <shareLib.h>
18 
19 namespace epics { namespace pvDatabase {
20 
21 class PVRecord;
22 typedef std::tr1::shared_ptr<PVRecord> PVRecordPtr;
23 typedef std::tr1::weak_ptr<PVRecord> PVRecordWPtr;
24 typedef std::map<std::string,PVRecordPtr> PVRecordMap;
25 
27 typedef std::tr1::shared_ptr<PVRecordField> PVRecordFieldPtr;
28 typedef std::vector<PVRecordFieldPtr> PVRecordFieldPtrArray;
29 typedef std::tr1::shared_ptr<PVRecordFieldPtrArray> PVRecordFieldPtrArrayPtr;
30 
32 typedef std::tr1::shared_ptr<PVRecordStructure> PVRecordStructurePtr;
33 typedef std::tr1::weak_ptr<PVRecordStructure> PVRecordStructureWPtr;
34 
36 typedef std::tr1::shared_ptr<PVRecordClient> PVRecordClientPtr;
37 typedef std::tr1::weak_ptr<PVRecordClient> PVRecordClientWPtr;
38 
39 class PVListener;
40 typedef std::tr1::shared_ptr<PVListener> PVListenerPtr;
41 typedef std::tr1::weak_ptr<PVListener> PVListenerWPtr;
42 
43 class PVDatabase;
44 typedef std::tr1::shared_ptr<PVDatabase> PVDatabasePtr;
45 typedef std::tr1::weak_ptr<PVDatabase> PVDatabaseWPtr;
46 
58  public std::tr1::enable_shared_from_this<PVRecord>
59 {
60 public:
65  virtual ~PVRecord();
72  virtual bool init() {initPVRecord(); return true;}
78  virtual void start() {}
88  virtual void process();
92  virtual void destroy() {}
101  virtual void remove();
109  virtual epics::pvAccess::RPCServiceAsync::shared_pointer getService(
110  epics::pvData::PVStructurePtr const & pvRequest)
111  {
112  return epics::pvAccess::RPCServiceAsync::shared_pointer();
113  }
121  static PVRecordPtr create(
122  std::string const & recordName,
123  epics::pvData::PVStructurePtr const & pvStructure);
129  std::string getRecordName() const { return recordName;}
135  PVRecordStructurePtr getPVRecordStructure() const { return pvRecordStructure;}
141  epics::pvData::PVStructurePtr getPVStructure() const { return pvStructure;}
149  PVRecordFieldPtr findPVRecordField(
150  epics::pvData::PVFieldPtr const & pvField);
156  void lock();
162  void unlock();
172  bool tryLock();
182  void lockOtherRecord(PVRecordPtr const & otherRecord);
191  bool addPVRecordClient(PVRecordClientPtr const & pvRecordClient);
200  bool addListener(
201  PVListenerPtr const & pvListener,
202  epics::pvCopy::PVCopyPtr const & pvCopy);
208  void nextMasterPVField(epics::pvData::PVFieldPtr const & pvField);
216  bool removeListener(
217  PVListenerPtr const & pvListener,
218  epics::pvCopy::PVCopyPtr const & pvCopy);
219 
220 
224  void beginGroupPut();
228  void endGroupPut();
233  int getTraceLevel() {return traceLevel;}
238  void setTraceLevel(int level) {traceLevel = level;}
239 protected:
245  PVRecord(
246  std::string const & recordName,
247  epics::pvData::PVStructurePtr const & pvStructure);
253  void initPVRecord();
254 private:
255  friend class PVDatabase;
256  void unlistenClients();
257 
258  PVRecordFieldPtr findPVRecordField(
259  PVRecordStructurePtr const & pvrs,
260  epics::pvData::PVFieldPtr const & pvField);
261 
262  std::string recordName;
263  epics::pvData::PVStructurePtr pvStructure;
264  PVRecordStructurePtr pvRecordStructure;
265  std::list<PVListenerWPtr> pvListenerList;
266  std::list<PVRecordClientWPtr> clientList;
268  std::size_t depthGroupPut;
269  int traceLevel;
270  // following only valid while addListener or removeListener is active.
271  bool isAddListener;
272  PVListenerWPtr pvListener;
273 
274  epics::pvData::PVTimeStamp pvTimeStamp;
275  epics::pvData::TimeStamp timeStamp;
276 };
277 
278 epicsShareFunc std::ostream& operator<<(std::ostream& o, const PVRecord& record);
279 
287  public virtual epics::pvData::PostHandler,
288  public std::tr1::enable_shared_from_this<PVRecordField>
289 {
290 public:
300  epics::pvData::PVFieldPtr const & pvField,
301  PVRecordStructurePtr const &parent,
302  PVRecordPtr const & pvRecord);
306  virtual ~PVRecordField() {}
312  PVRecordStructurePtr getParent();
318  epics::pvData::PVFieldPtr getPVField();
323  std::string getFullFieldName();
328  std::string getFullName();
333  PVRecordPtr getPVRecord();
338  virtual void postPut();
339 protected:
340  virtual void init();
341  virtual void postParent(PVRecordFieldPtr const & subField);
342  virtual void postSubField();
343 private:
344  bool addListener(PVListenerPtr const & pvListener);
345  virtual void removeListener(PVListenerPtr const & pvListener);
346  void callListener();
347 
348  std::list<PVListenerWPtr> pvListenerList;
349  epics::pvData::PVField::weak_pointer pvField;
350  bool isStructure;
351  PVRecordStructureWPtr parent;
352  PVRecordWPtr pvRecord;
353  std::string fullName;
354  std::string fullFieldName;
355  friend class PVRecordStructure;
356  friend class PVRecord;
357 };
358 
366 public:
375  epics::pvData::PVStructurePtr const &pvStructure,
376  PVRecordStructurePtr const &parent,
377  PVRecordPtr const & pvRecord);
381  virtual ~PVRecordStructure() {}
386  PVRecordFieldPtrArrayPtr getPVRecordFields();
391  epics::pvData::PVStructurePtr getPVStructure();
392 protected:
396  virtual void init();
397 private:
398  epics::pvData::PVStructure::weak_pointer pvStructure;
399  PVRecordFieldPtrArrayPtr pvRecordFields;
400  friend class PVRecord;
401 };
402 
409 public:
414  virtual ~PVRecordClient() {}
419  virtual void detach(PVRecordPtr const & pvRecord) = 0;
420 };
421 
429  virtual public PVRecordClient
430 {
431 public:
436  virtual ~PVListener() {}
443  virtual void dataPut(PVRecordFieldPtr const & pvRecordField) = 0;
450  virtual void dataPut(
451  PVRecordStructurePtr const & requested,
452  PVRecordFieldPtr const & pvRecordField) = 0;
457  virtual void beginGroupPut(PVRecordPtr const & pvRecord) = 0;
462  virtual void endGroupPut(PVRecordPtr const & pvRecord) = 0;
467  virtual void unlisten(PVRecordPtr const & pvRecord) = 0;
468 };
469 
476 public:
482  static PVDatabasePtr getMaster();
486  virtual ~PVDatabase();
493  PVRecordPtr findRecord(std::string const& recordName);
500  bool addRecord(PVRecordPtr const & record);
507  bool removeRecord(PVRecordPtr const & record);
512  epics::pvData::PVStringArrayPtr getRecordNames();
513 private:
514  friend class PVRecord;
515 
516  PVRecordWPtr removeFromMap(PVRecordPtr const & record);
517  PVDatabase();
518  void lock();
519  void unlock();
520  PVRecordMap recordMap;
522  static bool getMasterFirstCall;
523 };
524 
525 }}
526 
527 #endif /* PVDATABASE_H */
virtual void start()
Optional method for derived class.
Definition: pvDatabase.h:78
int getTraceLevel()
get trace level (0,1,2) means (nothing,lifetime,process)
Definition: pvDatabase.h:233
PVRecordStructurePtr getPVRecordStructure() const
Get the top level PVRecordStructure.
Definition: pvDatabase.h:135
epics::pvData::PVStructurePtr getPVStructure() const
Get the top level PVStructure.
Definition: pvDatabase.h:141
std::tr1::shared_ptr< PVListener > PVListenerPtr
Definition: pvDatabase.h:39
epicsMutexId lock
Definition: osiClockTime.c:37
virtual epics::pvAccess::RPCServiceAsync::shared_pointer getService(epics::pvData::PVStructurePtr const &pvRequest)
Optional method for derived class.
Definition: pvDatabase.h:109
std::tr1::shared_ptr< PVCopy > PVCopyPtr
Definition: pvPlugin.h:25
Listener for PVRecord::message.
Definition: pvDatabase.h:428
This class is implemented by code that calls setPostHander.
Definition: pvData.h:131
virtual ~PVRecordField()
Destructor.
Definition: pvDatabase.h:306
virtual ~PVRecordStructure()
Destructor.
Definition: pvDatabase.h:381
#define epicsShareFunc
Definition: shareLib.h:209
virtual ~PVListener()
Destructor.
Definition: pvDatabase.h:436
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
std::tr1::shared_ptr< PVRecordClient > PVRecordClientPtr
Definition: pvDatabase.h:35
std::map< std::string, PVRecordPtr > PVRecordMap
Definition: pvDatabase.h:24
virtual ~PVRecordClient()
Destructor.
Definition: pvDatabase.h:414
Mark external symbols and entry points for shared libraries.
std::tr1::weak_ptr< PVDatabase > PVDatabaseWPtr
Definition: pvDatabase.h:45
std::tr1::weak_ptr< PVListener > PVListenerWPtr
Definition: pvDatabase.h:41
std::tr1::shared_ptr< PVStringArray > PVStringArrayPtr
Definition: pvData.h:1464
Base interface for a PVRecord.
Definition: pvDatabase.h:56
std::tr1::shared_ptr< PVDatabase > PVDatabasePtr
Definition: pvDatabase.h:43
#define POINTER_DEFINITIONS(clazz)
Definition: sharedPtr.h:198
virtual bool init()
Optional initialization method.
Definition: pvDatabase.h:72
epicsMutex mutex
Definition: pvAccess.cpp:71
The interface for a database of PVRecords.
Definition: pvDatabase.h:475
Methods for accessing a timeStamp structure.
Definition: pvTimeStamp.h:38
#define epicsShareClass
Definition: shareLib.h:206
std::tr1::weak_ptr< PVRecordStructure > PVRecordStructureWPtr
Definition: pvDatabase.h:33
Interface for a field of a record.
Definition: pvDatabase.h:286
Callback for traversing master structure.
An interface implemented by code that accesses the record.
Definition: pvDatabase.h:408
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
virtual void destroy()
DEPRECATED.
Definition: pvDatabase.h:92
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::vector< PVRecordFieldPtr > PVRecordFieldPtrArray
Definition: pvDatabase.h:28
std::string getRecordName() const
Get the name of the record.
Definition: pvDatabase.h:129
std::tr1::shared_ptr< PVRecordStructure > PVRecordStructurePtr
Definition: pvDatabase.h:31
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
std::tr1::weak_ptr< PVRecord > PVRecordWPtr
Definition: pvDatabase.h:23
std::tr1::shared_ptr< PVRecordField > PVRecordFieldPtr
Definition: pvDatabase.h:26
Interface for a field that is a structure.
Definition: pvDatabase.h:365
epicsMutex Mutex
Definition: lock.h:28
std::tr1::shared_ptr< PVRecordFieldPtrArray > PVRecordFieldPtrArrayPtr
Definition: pvDatabase.h:29
std::ostream & operator<<(std::ostream &o, const PVRecord &record)
Definition: pvRecord.cpp:313
std::tr1::weak_ptr< PVRecordClient > PVRecordClientWPtr
Definition: pvDatabase.h:37
void setTraceLevel(int level)
set trace level (0,1,2) means (nothing,lifetime,process)
Definition: pvDatabase.h:238
Methods for manipulating timeStamp.
Definition: timeStamp.h:43