This is Unofficial EPICS BASE Doxygen Site
pvDatabase.cpp
Go to the documentation of this file.
1 /* pvDatabase.cpp */
12 #include <epicsGuard.h>
13 #include <list>
14 #include <map>
15 #include <pv/pvData.h>
16 #include <pv/pvTimeStamp.h>
17 #include <pv/rpcService.h>
18 
19 #define epicsExportSharedSymbols
20 #include "pv/pvStructureCopy.h"
21 #include "pv/pvDatabase.h"
22 #include "pv/pvPlugin.h"
23 #include "pv/pvArrayPlugin.h"
24 #include "pv/pvTimestampPlugin.h"
25 #include "pv/pvDeadbandPlugin.h"
26 
28 using namespace epics::pvData;
29 using namespace epics::pvCopy;
30 using namespace std;
31 
32 namespace epics { namespace pvDatabase {
33 
34 #define DEBUG_LEVEL 0
35 
36 static PVDatabasePtr pvDatabaseMaster;
37 
38 PVDatabasePtr PVDatabase::getMaster()
39 {
40  static bool firstTime = true;
41  if(firstTime) {
42  firstTime = false;
43  pvDatabaseMaster = PVDatabasePtr(new PVDatabase());
44  PVArrayPlugin::create();
45  PVTimestampPlugin::create();
46  PVDeadbandPlugin::create();
47  }
48  return pvDatabaseMaster;
49 }
50 
51 PVDatabase::PVDatabase()
52 {
53  if(DEBUG_LEVEL>0) cout << "PVDatabase::PVDatabase()\n";
54 }
55 
56 PVDatabase::~PVDatabase()
57 {
58  if(DEBUG_LEVEL>0) cout << "PVDatabase::~PVDatabase()\n";
59 }
60 
61 void PVDatabase::lock() {
62  mutex.lock();
63 }
64 
65 void PVDatabase::unlock() {
66  mutex.unlock();
67 }
68 
69 PVRecordPtr PVDatabase::findRecord(string const& recordName)
70 {
72  PVRecordMap::iterator iter = recordMap.find(recordName);
73  if(iter!=recordMap.end()) {
74  return (*iter).second;
75  }
76  return PVRecordPtr();
77 }
78 
79 bool PVDatabase::addRecord(PVRecordPtr const & record)
80 {
81  if(record->getTraceLevel()>0) {
82  cout << "PVDatabase::addRecord " << record->getRecordName() << endl;
83  }
85  string recordName = record->getRecordName();
86  PVRecordMap::iterator iter = recordMap.find(recordName);
87  if(iter!=recordMap.end()) {
88  return false;
89  }
90  record->start();
91  recordMap.insert(PVRecordMap::value_type(recordName,record));
92  return true;
93 }
94 
95 PVRecordWPtr PVDatabase::removeFromMap(PVRecordPtr const & record)
96 {
98  string recordName = record->getRecordName();
99  PVRecordMap::iterator iter = recordMap.find(recordName);
100  if(iter!=recordMap.end()) {
101  PVRecordPtr pvRecord = (*iter).second;
102  recordMap.erase(iter);
103  return pvRecord->shared_from_this();
104  }
105  return PVRecordWPtr();
106 }
107 
108 bool PVDatabase::removeRecord(PVRecordPtr const & record)
109 {
110  if(record->getTraceLevel()>0) {
111  cout << "PVDatabase::removeRecord " << record->getRecordName() << endl;
112  }
114  PVRecordWPtr pvRecord = removeFromMap(record);
115  if(pvRecord.use_count()!=0) {
116  pvRecord.lock()->unlistenClients();
117  return true;
118  }
119  return false;
120 }
121 
122 PVStringArrayPtr PVDatabase::getRecordNames()
123 {
125  PVStringArrayPtr xxx;
127  (getPVDataCreate()->createPVScalarArray(pvString));
128  size_t len = recordMap.size();
129  shared_vector<string> names(len);
130  PVRecordMap::iterator iter;
131  size_t i = 0;
132  for(iter = recordMap.begin(); iter!=recordMap.end(); ++iter) {
133  names[i++] = (*iter).first;
134  }
135  shared_vector<const string> temp(freeze(names));
136  pvStringArray->replace(temp);
137  return pvStringArray;
138 }
139 
140 }}
#define DEBUG_LEVEL
Definition: pvDatabase.cpp:34
A holder for a contiguous piece of memory.
Definition: sharedVector.h:27
epicsMutexId lock
Definition: osiClockTime.c:37
int i
Definition: scan.c:967
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:788
Definition: memory.hpp:41
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
std::tr1::shared_ptr< PVStringArray > PVStringArrayPtr
Definition: pvData.h:1464
std::tr1::shared_ptr< PVDatabase > PVDatabasePtr
Definition: pvDatabase.h:43
pvData
Definition: monitor.h:428
template class for all extensions of PVArray.
Definition: pvData.h:55
epicsMutex mutex
Definition: pvAccess.cpp:71
The interface for a database of PVRecords.
Definition: pvDatabase.h:475
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
std::tr1::weak_ptr< PVRecord > PVRecordWPtr
Definition: pvDatabase.h:23
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648