This is Unofficial EPICS BASE Doxygen Site
TestPVMonitor Struct Reference

#include "utilities.h"

+ Inheritance diagram for TestPVMonitor:
+ Collaboration diagram for TestPVMonitor:

Public Member Functions

 POINTER_DEFINITIONS (TestPVMonitor)
 
 TestPVMonitor (const TestPVChannel::shared_pointer &ch, const epics::pvData::MonitorRequester::shared_pointer &req, size_t bsize)
 
virtual ~TestPVMonitor ()
 
virtual void destroy ()
 
virtual epics::pvData::Status start ()
 
virtual epics::pvData::Status stop ()
 
virtual epics::pvData::MonitorElementPtr poll ()
 
virtual void release (epics::pvData::MonitorElementPtr const &monitorElement)
 
- Public Member Functions inherited from epics::pvAccess::Monitor
 POINTER_DEFINITIONS (Monitor)
 
virtual ~Monitor ()
 
virtual void release (MonitorElementPtr const &monitorElement)=0
 
virtual void getStats (Stats &s) const
 
virtual void reportRemoteQueueStatus (epics::pvData::int32 freeElements)
 
- Public Member Functions inherited from epics::pvAccess::Destroyable
 POINTER_DEFINITIONS (Destroyable)
 

Public Attributes

std::tr1::weak_ptr< TestPVMonitorweakself
 
const TestPVChannel::shared_pointer channel
 
const epics::pvData::MonitorRequester::weak_pointer requester
 
bool running
 
bool finalize
 
bool inoverflow
 
bool needWakeup
 
std::deque< epics::pvData::MonitorElementPtr > buffer
 
std::deque< epics::pvData::MonitorElementPtr > free
 
epics::pvData::MonitorElementPtr overflow
 

Additional Inherited Members

- Public Types inherited from epics::pvAccess::Monitor
typedef MonitorRequester requester_type
 
- Protected Member Functions inherited from epics::pvAccess::Destroyable
virtual ~Destroyable ()
 

Detailed Description

Definition at line 210 of file utilities.h.

Constructor & Destructor Documentation

TestPVMonitor::TestPVMonitor ( const TestPVChannel::shared_pointer &  ch,
const epics::pvData::MonitorRequester::shared_pointer &  req,
size_t  bsize 
)

Definition at line 267 of file utilities.cpp.

270  :channel(ch)
271  ,requester(req)
272  ,running(false)
273  ,finalize(false)
274  ,inoverflow(false)
275  ,needWakeup(false)
276 {
278  for(size_t i=0; i<bsize; i++) {
279  pva::MonitorElementPtr elem(new pvd::MonitorElement(fact->createPVStructure(channel->pv->dtype)));
280  free.push_back(elem);
281  }
282  overflow.reset(new pvd::MonitorElement(fact->createPVStructure(channel->pv->dtype)));
283  overflow->changedBitSet->set(0); // initially all changed
284  epicsAtomicIncrSizeT(&countTestPVMonitor);
285 }
int i
Definition: scan.c:967
const epics::pvData::MonitorRequester::weak_pointer requester
Definition: utilities.h:216
epics::pvData::MonitorElementPtr overflow
Definition: utilities.h:236
An element for a monitorQueue.
Definition: monitor.h:54
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
Definition: pvData.h:124
const TestPVChannel::shared_pointer channel
Definition: utilities.h:215
bool needWakeup
Definition: utilities.h:221
std::deque< epics::pvData::MonitorElementPtr > free
Definition: utilities.h:235
static const PVDataCreatePtr & getPVDataCreate()
bool inoverflow
Definition: utilities.h:220
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
Definition: monitor.h:40
EPICS_ATOMIC_INLINE size_t epicsAtomicIncrSizeT(size_t *pTarget)
TestPVMonitor::~TestPVMonitor ( )
virtual

Definition at line 287 of file utilities.cpp.

288 {
289  epicsAtomicDecrSizeT(&countTestPVMonitor);
290 }
EPICS_ATOMIC_INLINE size_t epicsAtomicDecrSizeT(size_t *pTarget)

Member Function Documentation

void TestPVMonitor::destroy ( )
virtual

Destroy this instance.

Implements epics::pvAccess::Destroyable.

Definition at line 292 of file utilities.cpp.

293 {
294  Guard G(channel->pv->lock);
295 
296  shared_pointer self(weakself);
297  channel->monitors.erase(self); // ensure we don't get more notifications
298 }
const TestPVChannel::shared_pointer channel
Definition: utilities.h:215
std::tr1::weak_ptr< TestPVMonitor > weakself
Definition: utilities.h:213
TestPVMonitor::POINTER_DEFINITIONS ( TestPVMonitor  )
pva::MonitorElementPtr TestPVMonitor::poll ( )
virtual

If monitor has occurred return data.

Returns
monitorElement for modified data. Must call get to determine if data is available.

May recursively call MonitorRequester::unlisten()

Implements epics::pvAccess::Monitor.

Definition at line 356 of file utilities.cpp.

357 {
359  Guard G(channel->pv->lock);
360  if(!buffer.empty()) {
361  ret = buffer.front();
362  buffer.pop_front();
363  }
364  testDiag("TestPVMonitor::poll %p %p", this, ret.get());
365  return ret;
366 }
int testDiag(const char *fmt,...)
const TestPVChannel::shared_pointer channel
Definition: utilities.h:215
std::deque< epics::pvData::MonitorElementPtr > buffer
Definition: utilities.h:235
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
Definition: monitor.h:40
void TestPVMonitor::release ( epics::pvData::MonitorElementPtr const &  monitorElement)
virtual

Definition at line 368 of file utilities.cpp.

369 {
370  Guard G(channel->pv->lock);
371  testDiag("TestPVMonitor::release %p %p", this, monitorElement.get());
372 
373  if(inoverflow) {
374  // buffer.empty() may be true if all elements poll()d by user
375  assert(this->free.empty());
376 
377  monitorElement->pvStructurePtr->copyUnchecked(*overflow->pvStructurePtr);
378  *monitorElement->changedBitSet = *overflow->changedBitSet;
379  *monitorElement->overrunBitSet = *overflow->overrunBitSet;
380 
381  overflow->changedBitSet->clear();
382  overflow->overrunBitSet->clear();
383 
384  buffer.push_back(monitorElement);
385  testDiag("TestPVMonitor::release overflow resume %p %p", this, monitorElement.get());
386  inoverflow = false;
387  } else {
388  this->free.push_back(monitorElement);
389  }
390 }
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
epics::pvData::MonitorElementPtr overflow
Definition: utilities.h:236
int testDiag(const char *fmt,...)
const TestPVChannel::shared_pointer channel
Definition: utilities.h:215
std::deque< epics::pvData::MonitorElementPtr > buffer
Definition: utilities.h:235
std::deque< epics::pvData::MonitorElementPtr > free
Definition: utilities.h:235
bool inoverflow
Definition: utilities.h:220
pvd::Status TestPVMonitor::start ( )
virtual

Start monitoring.

Returns
completion status.

Implements epics::pvAccess::Monitor.

Definition at line 300 of file utilities.cpp.

301 {
302  testDiag("TestPVMonitor::start %p", this);
303 
304  Guard G(channel->pv->lock);
305  if(finalize && buffer.empty())
306  return pvd::Status();
307 
308  if(running)
309  return pvd::Status();
310  running = true;
311 
312  // overflow element does double duty to hold this monitor's copy
313  overflow->pvStructurePtr->copyUnchecked(*channel->pv->value);
314 
315  if(this->buffer.empty()) {
316  needWakeup = true;
317  testDiag(" need wakeup");
318  }
319 
320  if(!this->free.empty()) {
321  pva::MonitorElementPtr monitorElement(this->free.front());
322 
323  if(overflow->changedBitSet->isEmpty()) {
324  overflow->changedBitSet->set(0); // initial update has all changed
325  overflow->overrunBitSet->clear();
326  }
327 
328  monitorElement->pvStructurePtr->copyUnchecked(*overflow->pvStructurePtr);
329  *monitorElement->changedBitSet = *overflow->changedBitSet;
330  *monitorElement->overrunBitSet = *overflow->overrunBitSet;
331  overflow->changedBitSet->clear();
332  overflow->overrunBitSet->clear();
333 
334  buffer.push_back(monitorElement);
335  this->free.pop_front();
336  testDiag(" push current");
337 
338  } else {
339  inoverflow = true;
340  overflow->changedBitSet->clear();
341  overflow->changedBitSet->set(0);
342  testDiag(" push overflow");
343  }
344 
345  return pvd::Status();
346 }
epics::pvData::MonitorElementPtr overflow
Definition: utilities.h:236
int testDiag(const char *fmt,...)
const TestPVChannel::shared_pointer channel
Definition: utilities.h:215
bool needWakeup
Definition: utilities.h:221
std::deque< epics::pvData::MonitorElementPtr > buffer
Definition: utilities.h:235
std::deque< epics::pvData::MonitorElementPtr > free
Definition: utilities.h:235
bool inoverflow
Definition: utilities.h:220
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
Definition: monitor.h:40
pvd::Status TestPVMonitor::stop ( )
virtual

Stop Monitoring.

Returns
completion status.

Implements epics::pvAccess::Monitor.

Definition at line 348 of file utilities.cpp.

349 {
350  testDiag("TestPVMonitor::stop %p", this);
351  Guard G(channel->pv->lock);
352  running = false;
353  return pvd::Status();
354 }
int testDiag(const char *fmt,...)
const TestPVChannel::shared_pointer channel
Definition: utilities.h:215

Member Data Documentation

std::deque<epics::pvData::MonitorElementPtr> TestPVMonitor::buffer

Definition at line 235 of file utilities.h.

const TestPVChannel::shared_pointer TestPVMonitor::channel

Definition at line 215 of file utilities.h.

bool TestPVMonitor::finalize

Definition at line 219 of file utilities.h.

std::deque<epics::pvData::MonitorElementPtr> TestPVMonitor::free

Definition at line 235 of file utilities.h.

bool TestPVMonitor::inoverflow

Definition at line 220 of file utilities.h.

bool TestPVMonitor::needWakeup

Definition at line 221 of file utilities.h.

epics::pvData::MonitorElementPtr TestPVMonitor::overflow

Definition at line 236 of file utilities.h.

const epics::pvData::MonitorRequester::weak_pointer TestPVMonitor::requester

Definition at line 216 of file utilities.h.

bool TestPVMonitor::running

Definition at line 218 of file utilities.h.

std::tr1::weak_ptr<TestPVMonitor> TestPVMonitor::weakself

Definition at line 213 of file utilities.h.


The documentation for this struct was generated from the following files: