pva2pva 1.4.2
Loading...
Searching...
No Matches
TestPVMonitor Struct Reference
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 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 Attributes

std::tr1::weak_ptr< TestPVMonitor > weakself
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

Detailed Description

Definition at line 220 of file utilities.h.

Constructor & Destructor Documentation

◆ TestPVMonitor()

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{
277 pvd::PVDataCreatePtr fact(pvd::PVDataCreate::getPVDataCreate());
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}

◆ ~TestPVMonitor()

TestPVMonitor::~TestPVMonitor ( )
virtual

Definition at line 287 of file utilities.cpp.

288{
289 epicsAtomicDecrSizeT(&countTestPVMonitor);
290}

Member Function Documentation

◆ destroy()

void TestPVMonitor::destroy ( )
virtual

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}

◆ poll()

pva::MonitorElementPtr TestPVMonitor::poll ( )
virtual

Definition at line 356 of file utilities.cpp.

357{
358 pva::MonitorElementPtr ret;
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}

◆ release()

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}

◆ start()

pvd::Status TestPVMonitor::start ( )
virtual

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}

◆ stop()

pvd::Status TestPVMonitor::stop ( )
virtual

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}

Member Data Documentation

◆ buffer

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

Definition at line 245 of file utilities.h.

◆ channel

const TestPVChannel::shared_pointer TestPVMonitor::channel

Definition at line 225 of file utilities.h.

◆ finalize

bool TestPVMonitor::finalize

Definition at line 229 of file utilities.h.

◆ free

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

Definition at line 245 of file utilities.h.

◆ inoverflow

bool TestPVMonitor::inoverflow

Definition at line 230 of file utilities.h.

◆ needWakeup

bool TestPVMonitor::needWakeup

Definition at line 231 of file utilities.h.

◆ overflow

epics::pvData::MonitorElementPtr TestPVMonitor::overflow

Definition at line 246 of file utilities.h.

◆ requester

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

Definition at line 226 of file utilities.h.

◆ running

bool TestPVMonitor::running

Definition at line 228 of file utilities.h.

◆ weakself

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

Definition at line 223 of file utilities.h.


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