10 #define epicsExportSharedSymbols 28 }
catch(std::runtime_error& e){
36 ,bufferSize(
getS<
pvd::
uint32>(pvr,
"record._options.queueSize", 2))
47 pvd::Monitor::shared_pointer M;
67 std::cerr<<
"monitorConnect() w/ new type. Monitor has outlived it's connection.\n";
90 std::cout<<
"upstream monitor start() fails\n";
94 for(interested_t::vector_type::const_iterator it = tonotify.begin(),
95 end = tonotify.end(); it!=end; ++it)
97 pvd::MonitorRequester::shared_pointer req((*it)->req);
127 typedef std::vector<MonitorUser::shared_pointer> dsnotify_t;
136 while((update=monitor->poll()))
140 lastelem->pvStructurePtr->copyUnchecked(*update->pvStructurePtr,
141 *update->changedBitSet);
142 *
lastelem->changedBitSet = *update->changedBitSet;
143 *
lastelem->overrunBitSet = *update->overrunBitSet;
144 monitor->release(update);
182 dsnotify.push_back(pusr);
186 *elem->overrunBitSet = *
lastelem->overrunBitSet;
187 *elem->changedBitSet = *
lastelem->changedBitSet;
190 elem->pvStructurePtr->copyUnchecked(*
lastelem->pvStructurePtr);
192 usr->
filled.push_back(elem);
193 usr->
empty.pop_front();
204 FOREACH(dsnotify_t::iterator, it,end,dsnotify) {
206 pvd::MonitorRequester::shared_pointer req(usr->
req);
208 req->monitorEvent(*it);
216 pvd::Monitor::shared_pointer M;
232 pvd::MonitorRequester::shared_pointer req(usr->
req);
233 if(usr->
inuse.empty())
241 return "MonitorCacheEntry";
273 pvd::MonitorRequester::shared_pointer
req(this->
req.lock());
281 if(!
entry->startresult.isSuccess())
282 return entry->startresult;
286 lval =
entry->lastelem->pvStructurePtr;
294 for(
unsigned i=0;
i<
empty.size();
i++) {
304 if(lval && !
empty.empty()) {
308 elem->pvStructurePtr->copy(*lval);
309 elem->changedBitSet->set(0);
310 elem->overrunBitSet->clear();
350 std::set<epics::pvData::MonitorElementPtr>::iterator it =
inuse.find(monitorElement);
351 if(it!=
inuse.end()) {
367 empty.push_back(monitorElement);
372 throw std::invalid_argument(
"Can't release MonitorElement not in use");
380 return "MonitorCacheEntry";
virtual epics::pvData::Status stop()
virtual void unlisten(epics::pvData::MonitorPtr const &monitor)
epics::pvData::MonitorRequester::weak_pointer req
PVScalar is the base class for each scalar field.
epics::pvData::MonitorPtr mon
ChannelCacheEntry *const chan
#define assert(exp)
Declare that a condition should be true.
#define FOREACH(ITERTYPE, IT, END, C)
virtual std::string getRequesterName()
epicsMutex & mutex() const
std::deque< epics::pvData::MonitorElementPtr > empty
virtual void release(epics::pvData::MonitorElementPtr const &monitorElement)
virtual epics::pvData::Status start()
virtual ~MonitorCacheEntry()
std::tr1::shared_ptr< const Structure > StructureConstPtr
An element for a monitorQueue.
virtual epics::pvData::MonitorElementPtr poll()
epics::pvData::MonitorElementPtr overflowElement
epics::pvData::Status startresult
EPICS_ATOMIC_INLINE size_t epicsAtomicDecrSizeT(size_t *pTarget)
MonitorCacheEntry(ChannelCacheEntry *ent, const epics::pvData::PVStructure::shared_pointer &pvr)
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
virtual std::string getRequesterName()
MonitorUser(const MonitorCacheEntry::shared_pointer &)
epics::pvData::StructureConstPtr typedesc
APIs for the epicsMutex mutual exclusion semaphore.
vector_type lock_vector() const
virtual void monitorEvent(epics::pvData::MonitorPtr const &monitor)
std::tr1::shared_ptr< PVStructure > PVStructurePtr
bool getS(const epics::pvData::PVStructurePtr &S, const char *name, A &val)
static size_t num_instances
std::vector< value_pointer > vector_type
epicsMutex & mutex() const
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
std::tr1::shared_ptr< MonitorUser > value_pointer
EPICS_ATOMIC_INLINE size_t epicsAtomicIncrSizeT(size_t *pTarget)
epics::pvData::MonitorElement::shared_pointer lastelem
virtual void monitorConnect(epics::pvData::Status const &status, epics::pvData::MonitorPtr const &monitor, epics::pvData::StructureConstPtr const &structure)
static size_t num_instances
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
std::tr1::shared_ptr< Monitor > MonitorPtr
std::deque< epics::pvData::MonitorElementPtr > filled
std::set< epics::pvData::MonitorElementPtr > inuse