15#ifdef epicsExportSharedSymbols
16# define monitorEpicsExportSharedSymbols
17# undef epicsExportSharedSymbols
20#include <epicsMutex.h>
23#include <pv/sharedPtr.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>
41typedef std::tr1::shared_ptr<MonitorElement> MonitorElementPtr;
45typedef std::tr1::shared_ptr<Monitor> MonitorPtr;
54class epicsShareClass MonitorElement {
56 POINTER_DEFINITIONS(MonitorElement);
59 const epics::pvData::BitSet::shared_pointer changedBitSet;
60 const epics::pvData::BitSet::shared_pointer overrunBitSet;
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;
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) {
168 MonitorElementPtr ret;
176 void attach(
const Monitor::shared_pointer& M) {
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
259 public std::tr1::enable_shared_from_this<MonitorFIFO>
267 POINTER_DEFINITIONS(
Source);
274 struct epicsShareClass Config {
278 bool dropEmptyUpdates;
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(),
297 inline const std::tr1::shared_ptr<MonitorRequester>
getRequester()
const {
return requester.lock(); }
338 virtual MonitorElementPtr
poll() OVERRIDE FINAL;
339 virtual
void release(MonitorElementPtr const & monitorElement) OVERRIDE FINAL;
340 virtual
void getStats(Stats& s) const OVERRIDE FINAL;
346 size_t _freeCount() const;
348 friend
void providerRegInit(
void*);
349 static
size_t num_instances;
365 mutable epicsMutex mutex;
377 const
epics::
pvData::PVStructure::const_shared_pointer pvRequest;
381 const
Source::shared_pointer upstream;
400 size_t freeHighLevel;
401 epicsInt32 flowCount;
409 buffer_t inuse,
empty, returned;
430using epics::pvAccess::MonitorElement;
431using epics::pvAccess::MonitorElementPtr;
432using epics::pvAccess::MonitorElementPtrArray;
433using epics::pvAccess::Monitor;
434using epics::pvAccess::MonitorPtr;
basic_ostream< char > ostream
constexpr _Require< __not_< __is_tuple_like< _Tp > >, is_move_constructible< _Tp >, is_move_assignable< _Tp > > swap(_Tp &, _Tp &) noexcept(__and_< is_nothrow_move_constructible< _Tp >, is_nothrow_move_assignable< _Tp > >::value)
basic_ostream< _CharT, _Traits > & operator<<(basic_ostream< _CharT, _Traits > &__os, const basic_string< _CharT, _Traits, _Alloc > &__str)
constexpr auto empty(const _Container &__cont) noexcept(noexcept(__cont.empty())) -> decltype(__cont.empty())
constexpr auto begin(_Container &__cont) -> decltype(__cont.begin())
constexpr auto end(_Container &__cont) -> decltype(__cont.end())
Instance declaring destroy method.
A (single ownership) smart pointer to extract a MonitorElement from a Monitor queue.
MonitorElementPtr letGo()
An element for a monitorQueue.
Utility implementation of Monitor.
MonitorFIFO(const std::tr1::shared_ptr< MonitorRequester > &requester, const pvData::PVStructure::const_shared_pointer &pvRequest, const Source::shared_pointer &source=Source::shared_pointer(), Config *conf=0)
virtual MonitorElementPtr poll()
If monitor has occurred return data.
const std::tr1::shared_ptr< MonitorRequester > getRequester() const
virtual void reportRemoteQueueStatus(epics::pvData::int32 freeElements)
Report remote queue status.
void open(const epics::pvData::StructureConstPtr &type)
Mark subscription as "open" with the associated structure type.
void close()
Abnormal closure (eg. due to upstream dis-connection).
virtual epics::pvData::Status stop()
Stop Monitoring.
virtual epics::pvData::Status start()
Start monitoring.
void post(const pvData::PVStructure &value, const epics::pvData::BitSet &changed, const epics::pvData::BitSet &overrun=epics::pvData::BitSet())
Consume a free slot if available, otherwise squash with most recent.
bool tryPost(const pvData::PVStructure &value, const epics::pvData::BitSet &changed, const epics::pvData::BitSet &overrun=epics::pvData::BitSet(), bool force=false)
void setFreeHighMark(double level)
virtual void destroy()
Destroy this instance.
void finish()
Successful closure (eg. RDB query done).
size_t freeCount() const
Number of unused FIFO slots at this moment, which may changed in the next.
virtual void release(MonitorElementPtr const &monitorElement)
Release a MonitorElement that was returned by poll.
Access to Monitor subscription and queue.
virtual epics::pvData::Status stop()=0
Stop Monitoring.
virtual epics::pvData::Status start()=0
Start monitoring.
virtual void reportRemoteQueueStatus(epics::pvData::int32 freeElements)
Report remote queue status.
virtual MonitorElementPtr poll()=0
If monitor has occurred return data.
virtual void release(MonitorElementPtr const &monitorElement)=0
Release a MonitorElement that was returned by poll.
Callback implemented by monitor clients.
A (single ownership) smart pointer to extract a MonitorElement from a Monitor queue.
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Copyright - See the COPYRIGHT that is included with this distribution.
virtual void freeHighMark(MonitorFIFO *mon, size_t numEmpty)