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>
37namespace epics {
namespace pvAccess {
41typedef std::tr1::shared_ptr<MonitorElement> MonitorElementPtr;
45typedef std::tr1::shared_ptr<Monitor> MonitorPtr;
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() {}
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
213inline MonitorElement::Ref
begin(Monitor& mon) {
return MonitorElement::Ref(mon); }
214inline MonitorElement::Ref
end(Monitor& mon) {
return MonitorElement::Ref(); }
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(); }
299 void show(std::ostream& strm)
const;
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());
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;
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;
421std::ostream&
operator<<(std::ostream& strm,
const MonitorFIFO& fifo) {
428namespace epics {
namespace pvData {
431using epics::pvAccess::MonitorElementPtr;
434using epics::pvAccess::MonitorPtr;
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()
analogous to auto_ptr<>::release() but given a different name to avoid being confused with Monitor::r...
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)
const std::tr1::shared_ptr< MonitorRequester > getRequester() const
Access to MonitorRequester passed to ctor, or NULL if it has already been destroyed.
virtual void destroy()
Destroy this instance.
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.
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Copyright - See the COPYRIGHT that is included with this distribution.
Source methods may be called with downstream mutex locked.
virtual void freeHighMark(MonitorFIFO *mon, size_t numEmpty)
Called when MonitorFIFO::freeCount() rises above the level computed from MonitorFIFO::setFreeHighMark...