15 #ifdef epicsExportSharedSymbols 16 # define monitorEpicsExportSharedSymbols 17 # undef epicsExportSharedSymbols 20 #include <epicsMutex.h> 21 #include <pv/status.h> 22 #include <pv/pvData.h> 23 #include <pv/sharedPtr.h> 24 #include <pv/bitSet.h> 25 #include <pv/createRequest.h> 27 #ifdef monitorEpicsExportSharedSymbols 28 # define epicsExportSharedSymbols 29 # undef monitorEpicsExportSharedSymbols 32 #include <pv/requester.h> 33 #include <pv/destroyable.h> 37 namespace epics {
namespace pvAccess {
39 class MonitorRequester;
41 typedef std::tr1::shared_ptr<MonitorElement> MonitorElementPtr;
42 typedef std::vector<MonitorElementPtr> MonitorElementPtrArray;
45 typedef std::tr1::shared_ptr<Monitor> MonitorPtr;
54 class epicsShareClass MonitorElement {
56 POINTER_DEFINITIONS(MonitorElement);
57 MonitorElement(epics::pvData::PVStructurePtr
const & pvStructurePtr);
58 const epics::pvData::PVStructurePtr pvStructurePtr;
59 const epics::pvData::BitSet::shared_pointer changedBitSet;
60 const epics::pvData::BitSet::shared_pointer overrunBitSet;
69 class epicsShareClass Monitor :
public virtual Destroyable{
71 POINTER_DEFINITIONS(Monitor);
72 typedef MonitorRequester requester_type;
79 virtual epics::pvData::Status start() = 0;
84 virtual epics::pvData::Status stop() = 0;
92 virtual MonitorElementPtr poll() = 0;
98 virtual void release(MonitorElementPtr
const & monitorElement) = 0;
106 virtual void getStats(Stats& s)
const {
107 s.nfilled = s.noutstanding = s.nempty = 0;
114 virtual void reportRemoteQueueStatus(epics::pvData::int32 freeElements) {}
146 class MonitorElement::Ref
149 MonitorElementPtr elem;
151 Ref() :mon(0), elem() {}
152 Ref(Monitor& M) :mon(&M), elem(mon->poll()) {}
153 Ref(
const Monitor::shared_pointer& M) :mon(M.get()), elem(mon->poll()) {}
155 #if __cplusplus
>=201103L
156 Ref(Ref&& o) :mon(o.mon), elem(o.elem) {
162 std::swap(mon , o.mon);
163 std::swap(elem, o.elem);
167 MonitorElementPtr letGo() {
168 MonitorElementPtr ret;
172 void attach(Monitor& M) {
176 void attach(
const Monitor::shared_pointer& M) {
181 if(elem) mon->release(elem);
186 if(elem && mon) mon->release(elem);
193 #if __cplusplus
>=201103L
194 inline explicit operator
bool()
const {
return elem.get(); }
197 typedef const Monitor*
const * hidden_bool_type;
199 operator hidden_bool_type()
const {
return elem.get() ? &mon : 0; }
201 inline MonitorElement* operator->() {
return elem.get(); }
202 inline MonitorElement& operator*() {
return *elem; }
203 inline MonitorElement* get() {
return elem.get(); }
205 inline bool operator==(
const Ref& o)
const {
return elem==o.elem; }
206 inline bool operator!=(
const Ref& o)
const {
return !(*
this==o); }
208 EPICS_NOT_COPYABLE(Ref)
211 #if __cplusplus
>=201103L
213 inline MonitorElement::Ref begin(Monitor& mon) {
return MonitorElement::Ref(mon); }
214 inline MonitorElement::Ref end(Monitor& mon) {
return MonitorElement::Ref(); }
258 class epicsShareClass MonitorFIFO :
public Monitor,
259 public std::tr1::enable_shared_from_this<MonitorFIFO>
262 POINTER_DEFINITIONS(MonitorFIFO);
266 struct epicsShareClass Source {
267 POINTER_DEFINITIONS(Source);
272 virtual void freeHighMark(MonitorFIFO *mon, size_t numEmpty) {}
274 struct epicsShareClass Config {
278 bool dropEmptyUpdates;
279 epics::pvData::PVRequestMapper::mode_t mapperMode;
289 MonitorFIFO(
const std::tr1::shared_ptr<MonitorRequester> &requester,
290 const pvData::PVStructure::const_shared_pointer &pvRequest,
291 const Source::shared_pointer& source = Source::shared_pointer(),
293 virtual ~MonitorFIFO();
297 inline const std::tr1::shared_ptr<MonitorRequester> getRequester()
const {
return requester.lock(); }
299 void show(std::ostream& strm)
const;
301 virtual void destroy() OVERRIDE FINAL;
308 void setFreeHighMark(
double level);
312 void open(
const epics::pvData::StructureConstPtr& type);
321 bool tryPost(
const pvData::PVStructure& value,
322 const epics::pvData::BitSet& changed,
323 const epics::pvData::BitSet& overrun = epics::pvData::BitSet(),
326 void post(
const pvData::PVStructure& value,
327 const epics::pvData::BitSet& changed,
328 const epics::pvData::BitSet& overrun = epics::pvData::BitSet());
336 virtual epics::pvData::Status start() OVERRIDE FINAL;
337 virtual epics::pvData::Status stop() OVERRIDE FINAL;
338 virtual MonitorElementPtr poll() OVERRIDE FINAL;
339 virtual void release(MonitorElementPtr
const & monitorElement) OVERRIDE FINAL;
340 virtual void getStats(Stats& s)
const OVERRIDE FINAL;
341 virtual void reportRemoteQueueStatus(epics::pvData::int32 freeElements) OVERRIDE FINAL;
344 size_t freeCount()
const;
346 size_t _freeCount()
const;
348 friend void providerRegInit(
void*);
349 static size_t num_instances;
365 mutable epicsMutex mutex;
375 const std::tr1::weak_ptr<MonitorRequester> requester;
377 const epics::pvData::PVStructure::const_shared_pointer pvRequest;
381 const Source::shared_pointer upstream;
391 epics::pvData::BitSet scratch, oscratch;
398 epics::pvData::Status error;
400 size_t freeHighLevel;
401 epicsInt32 flowCount;
403 epics::pvData::PVRequestMapper mapper;
405 typedef std::list<MonitorElementPtr> buffer_t;
409 buffer_t inuse, empty, returned;
417 EPICS_NOT_COPYABLE(MonitorFIFO)
421 std::ostream& operator<<(std::ostream& strm,
const MonitorFIFO& fifo) {
428 namespace epics {
namespace pvData {
430 using epics::pvAccess::MonitorElement;
431 using epics::pvAccess::MonitorElementPtr;
432 using epics::pvAccess::MonitorElementPtrArray;
433 using epics::pvAccess::Monitor;
434 using epics::pvAccess::MonitorPtr;