10 template<
typename T,
typename A>
22 const std::tr1::weak_ptr<epics::pvAccess::ChannelProvider>& prov,
23 const epics::pvAccess::ChannelRequester::shared_pointer& req,
34 const epics::pvAccess::ChannelProvider::weak_pointer
provider;
45 {
return epics::pvAccess::ChannelProvider::shared_pointer(provider); }
51 {
return requester_type::shared_pointer(requester); }
53 virtual void getField(epics::pvAccess::GetFieldRequester::shared_pointer
const & requester,std::string
const & subField)
OVERRIDE 82 const requester_t::weak_pointer
requester;
87 typedef std::deque<epics::pvAccess::MonitorElementPtr> buffer_t;
91 buffer_t inuse,
empty;
95 const requester_t::weak_pointer& requester,
96 const epics::pvData::PVStructure::shared_pointer& pvReq)
115 BaseMonitor::shared_pointer
self(shared_from_this());
116 requester_t::shared_pointer req(requester.lock());
121 empty.resize(nbuffers);
122 for(
size_t i=0;
i<empty.size();
i++) {
129 req->monitorConnect(sts,
self, dtype);
139 requester_t::shared_pointer req;
141 if(!complete || !running)
return false;
145 if(empty.empty())
return false;
148 req = requester.lock();
153 req->monitorEvent(shared_from_this());
163 requester_t::shared_pointer req;
165 if(!complete || !running)
return false;
168 oflow = inoverflow =
true;
173 req = requester.lock();
174 oflow = inoverflow =
false;
179 req->monitorEvent(shared_from_this());
191 requester_t::shared_pointer req;
193 if(!complete || !running)
return false;
196 oflow = inoverflow =
true;
197 overflow |= overflowed;
198 overflow.
or_and(updated, changed);
205 req = requester.lock();
206 oflow = inoverflow =
false;
211 req->monitorEvent(shared_from_this());
219 requester_t::shared_pointer req;
221 if(!complete || !running)
return false;
224 oflow = inoverflow =
true;
225 overflow.
or_and(updated, changed);
232 req = requester.lock();
233 oflow = inoverflow =
false;
238 req->monitorEvent(shared_from_this());
252 elem->pvStructurePtr->copyUnchecked(*complete);
253 *elem->changedBitSet = changed;
254 *elem->overrunBitSet = overflow;
260 inuse.push_back(elem);
283 BaseMonitor::shared_pointer
self;
286 if(running)
return ret;
288 if(!complete)
return ret;
289 inoverflow = empty.empty();
299 if(notify) onStart();
305 BaseMonitor::shared_pointer
self;
321 if(running && complete && !inuse.empty()) {
330 BaseMonitor::shared_pointer
self;
333 empty.push_back(elem);
335 self = weakself.lock();
338 self->requestUpdate();
366 std::tr1::shared_ptr<CP> ret(last_shared.lock());
374 virtual epics::pvAccess::ChannelProvider::shared_pointer
newInstance(
const std::tr1::shared_ptr<epics::pvAccess::Configuration>&)
376 std::tr1::shared_ptr<CP> ret(
new CP());
381 #endif // PVAHELPER_H epics::pvData::BitSetPtr empty
PVScalar is the base class for each scalar field.
bool post(guard_t &guard)
post update of pending changes. eg. call from requestUpdate()
#define assert(exp)
Declare that a condition should be true.
POINTER_DEFINITIONS(Channel)
epicsGuard< epicsMutex > guard_t
BitSet & clear(uint32 bitIndex)
virtual std::tr1::shared_ptr< epics::pvAccess::ChannelProvider > getProvider() OVERRIDE FINAL
virtual void requestUpdate()
virtual ~BaseChannelProviderFactory()
bool post(guard_t &guard, const epics::pvData::BitSet &updated, const epics::pvData::BitSet &overflowed)
post update with changed and overflowed masks (eg. when updates were lost in some upstream queue) ...
BaseChannel(const std::string &name, const std::tr1::weak_ptr< epics::pvAccess::ChannelProvider > &prov, const epics::pvAccess::ChannelRequester::shared_pointer &req, const epics::pvData::StructureConstPtr &dtype)
void assertIdenticalMutex(const T &) const
std::tr1::shared_ptr< const Structure > StructureConstPtr
virtual std::string getFactoryName()
epicsGuardRelease< epicsMutex > unguard_t
An element for a monitorQueue.
std::tr1::weak_ptr< CP > last_shared
virtual std::string getRemoteAddress() OVERRIDE
const epics::pvData::PVStructurePtr & getValue()
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
bool post(guard_t &guard, const epics::pvData::BitSet &updated)
post update with changed
size_t nfilled
of elements ready to be poll()d
shared_pointer shared_from_this()
virtual std::string getChannelName() OVERRIDE FINAL
BaseChannelProviderFactory(const char *name)
void connect(guard_t &guard, const epics::pvData::PVStructurePtr &value)
virtual void getStats(Stats &s) const
const epics::pvAccess::ChannelProvider::weak_pointer provider
virtual std::string getRequesterName() OVERRIDE
std::tr1::shared_ptr< PVScalar > PVScalarPtr
virtual void printInfo(std::ostream &out) OVERRIDE
virtual void getField(epics::pvAccess::GetFieldRequester::shared_pointer const &requester, std::string const &subField) OVERRIDE
virtual std::tr1::shared_ptr< epics::pvAccess::ChannelRequester > getChannelRequester() OVERRIDE FINAL
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Callback implemented by monitor clients.
bool getS(const epics::pvData::PVStructurePtr &S, const char *name, A &val)
bool post(guard_t &guard, const epics::pvData::BitSet &updated, no_overflow)
post update if queue not full, if full return false w/o overflow
size_t nempty
of elements available for new remote data
void or_and(const BitSet &set1, const BitSet &set2)
size_t noutstanding
of elements poll()d but not released()d
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
const requester_type::weak_pointer requester
epicsGuard< epicsMutex > guard_t
virtual void destroy() OVERRIDE FINAL
BitSet & set(uint32 bitIndex)
virtual epics::pvAccess::ChannelProvider::shared_pointer sharedInstance()
virtual epics::pvAccess::ChannelProvider::shared_pointer newInstance(const std::tr1::shared_ptr< epics::pvAccess::Configuration > &)
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
const epics::pvData::StructureConstPtr fielddesc
BaseMonitor(epicsMutex &lock, const requester_t::weak_pointer &requester, const epics::pvData::PVStructure::shared_pointer &pvReq)
epics::pvAccess::MonitorRequester requester_t