6 #include <dbUnitTest.h> 11 #define epicsExportSharedSymbols 21 static size_t countTestChannelRequester;
24 :laststate(
pva::Channel::NEVER_CONNECTED)
37 testDiag(
"channelCreated %s", channel ? channel->getChannelName().c_str() :
"<fails>");
48 testDiag(
"channelStateChange %s %d", channel->getChannelName().c_str(), (int)connectionState);
75 static size_t countTestChannelGetRequester;
90 const epics::pvAccess::ChannelGet::shared_pointer &
get,
91 const epics::pvData::Structure::const_shared_pointer &
structure)
94 testFail(
"channelGetConnect() called twice");
102 const epics::pvAccess::ChannelGet::shared_pointer &
get,
103 const epics::pvData::PVStructure::shared_pointer &pvStructure,
104 const epics::pvData::BitSet::shared_pointer &bitSet)
122 epics::pvAccess::ChannelPut::shared_pointer
const & channelPut,
123 epics::pvData::Structure::const_shared_pointer
const &
structure)
133 epics::pvAccess::ChannelPut::shared_pointer
const & channelPut)
142 epics::pvAccess::ChannelPut::shared_pointer
const & channelPut,
143 epics::pvData::PVStructure::shared_pointer
const & pvStructure,
144 epics::pvData::BitSet::shared_pointer
const & bitSet)
154 static size_t countTestChannelMonitorRequester;
183 testDiag(
"monitorEvent %p", monitor.get());
191 testDiag(
"unlisten %p", monitor.get());
218 static size_t countTestPVChannel;
221 const std::tr1::shared_ptr<pva::ChannelRequester> &req)
248 pvd::Monitor::shared_pointer
250 pvd::MonitorRequester::shared_pointer
const &
requester,
251 pvd::PVStructure::shared_pointer
const & pvRequest)
254 TestPVMonitor::shared_pointer ret(
new TestPVMonitor(
self, requester, 2));
260 testDiag(
"TestPVChannel::createMonitor %s %p",
pv->
name.c_str(), ret.get());
265 static size_t countTestPVMonitor;
268 const pvd::MonitorRequester::shared_pointer& req,
278 for(
size_t i=0;
i<bsize;
i++) {
280 free.push_back(elem);
302 testDiag(
"TestPVMonitor::start %p",
this);
315 if(this->
buffer.empty()) {
320 if(!this->
free.empty()) {
323 if(
overflow->changedBitSet->isEmpty()) {
328 monitorElement->pvStructurePtr->copyUnchecked(*
overflow->pvStructurePtr);
329 *monitorElement->changedBitSet = *
overflow->changedBitSet;
330 *monitorElement->overrunBitSet = *
overflow->overrunBitSet;
334 buffer.push_back(monitorElement);
335 this->
free.pop_front();
350 testDiag(
"TestPVMonitor::stop %p",
this);
364 testDiag(
"TestPVMonitor::poll %p %p",
this, ret.get());
371 testDiag(
"TestPVMonitor::release %p %p",
this, monitorElement.get());
377 monitorElement->pvStructurePtr->copyUnchecked(*
overflow->pvStructurePtr);
378 *monitorElement->changedBitSet = *
overflow->changedBitSet;
379 *monitorElement->overrunBitSet = *
overflow->overrunBitSet;
384 buffer.push_back(monitorElement);
385 testDiag(
"TestPVMonitor::release overflow resume %p %p",
this, monitorElement.get());
388 this->
free.push_back(monitorElement);
392 static size_t countTestPV;
395 const std::tr1::shared_ptr<TestProvider>& provider,
401 ,
value(factory->createPVStructure(dtype))
415 post(changed, notify);
425 FOREACH(channels_t::vector_type::const_iterator, it, end, toupdate)
430 FOREACH(TestPVChannel::monitors_t::vector_type::const_iterator, it2, end2, tomon)
437 mon->
overflow->pvStructurePtr->copyUnchecked(*
value, changed);
439 if(mon->
free.empty()) {
441 mon->
overflow->overrunBitSet->or_and(*mon->
overflow->changedBitSet, changed);
442 *mon->
overflow->changedBitSet |= changed;
443 testDiag(
"overflow changed '%s' overrun '%s'",
456 elem->pvStructurePtr->copyUnchecked(*mon->
overflow->pvStructurePtr);
457 *elem->changedBitSet = changed;
458 elem->overrunBitSet->
clear();
460 mon->
buffer.push_back(elem);
461 mon->
free.pop_front();
462 testDiag(
"push %p changed '%s' overflow '%s'", elem.get(),
463 toString(*elem->changedBitSet).c_str(),
464 toString(*elem->overrunBitSet).c_str());
470 pva::MonitorRequester::shared_pointer req(mon->
requester.lock());
473 req->monitorEvent(*it2);
484 FOREACH(channels_t::vector_type::const_iterator, it, end, toupdate)
490 pva::ChannelRequester::shared_pointer req(chan->
requester.lock());
498 static size_t countTestProvider;
515 pva::ChannelFind::shared_pointer
518 pva::ChannelFind::shared_pointer ret;
527 pva::ChannelFind::shared_pointer
529 pva::ChannelFindRequester::shared_pointer
const &
requester)
531 pva::ChannelFind::shared_pointer ret;
537 pva::Channel::shared_pointer
541 return createChannel(channelName,
requester, priority,
"<unused>");
544 pva::Channel::shared_pointer
546 pva::ChannelRequester::shared_pointer
const &
requester,
547 short priority, std::string
const & address)
549 pva::Channel::shared_pointer ret;
554 TestPV::shared_pointer
pv(pvs.find(channelName));
557 pv->channels.insert(chan);
558 chan->weakself = chan;
568 testDiag(
"createChannel %s %p", channelName.c_str(), ret.get());
572 TestPV::shared_pointer
576 TestPV::shared_pointer ret(
new TestPV(name, shared_from_this(), tdef));
577 pvs.insert(name, ret);
587 FOREACH(pvs_t::lock_vector_type::const_iterator, pvit, pvend, allpvs)
592 FOREACH(TestPV::channels_t::vector_type::const_iterator, chit, chend,
channels)
600 FOREACH(TestPVChannel::monitors_t::vector_type::const_iterator, monit, monend, monitors)
608 testDiag(
" wakeup monitor %p", mon);
610 pva::MonitorRequester::shared_pointer req(mon->
requester.lock());
613 req->monitorEvent(*monit);
624 #define TESTC(name) temp=epicsAtomicGetSizeT(&count##name); ok &= temp==0; testDiag("num. live " #name " %u", (unsigned)temp) 632 testOk(ok,
"All instances free'd");
virtual void unlisten(epics::pvData::MonitorPtr const &monitor)
epics::pvData::BitSet::shared_pointer changed
virtual void release(epics::pvData::MonitorElementPtr const &monitorElement)
TestChannelMonitorRequester()
virtual ~TestChannelGetRequester()
epics::pvAccess::ChannelGet::shared_pointer channelGet
epics::pvData::Status status
virtual epics::pvData::Monitor::shared_pointer createMonitor(epics::pvData::MonitorRequester::shared_pointer const &monitorRequester, epics::pvData::PVStructure::shared_pointer const &pvRequest)
#define assert(exp)
Declare that a condition should be true.
epics::pvData::Status statusPut
BitSet & clear(uint32 bitIndex)
#define FOREACH(ITERTYPE, IT, END, C)
epics::pvData::Status statusGet
epics::pvAccess::Channel::shared_pointer chan
TestPVMonitor(const TestPVChannel::shared_pointer &ch, const epics::pvData::MonitorRequester::shared_pointer &req, size_t bsize)
const epics::pvData::MonitorRequester::weak_pointer requester
virtual ~TestChannelPutRequester()
epics::pvAccess::ChannelPut::shared_pointer put
TestPV(const std::string &name, const std::tr1::shared_ptr< TestProvider > &provider, const epics::pvData::StructureConstPtr &dtype)
epics::pvData::MonitorElementPtr overflow
virtual epics::pvAccess::ChannelFind::shared_pointer channelFind(std::string const &channelName, epics::pvAccess::ChannelFindRequester::shared_pointer const &channelFindRequester)
TestChannelPutRequester()
virtual void channelPutConnect(const epics::pvData::Status &status, epics::pvAccess::ChannelPut::shared_pointer const &channelPut, epics::pvData::Structure::const_shared_pointer const &structure)
epicsGuard< epicsMutex > Guard
std::tr1::shared_ptr< const Structure > StructureConstPtr
epics::pvData::Status statusConnect
int testDiag(const char *fmt,...)
virtual ~TestChannelRequester()
An element for a monitorQueue.
epics::pvData::Structure::const_shared_pointer fielddesc
EPICS_ATOMIC_INLINE size_t epicsAtomicDecrSizeT(size_t *pTarget)
epics::pvData::StructureConstPtr dtype
epics::pvData::Structure::const_shared_pointer fielddesc
virtual void channelStateChange(epics::pvAccess::Channel::shared_pointer const &channel, epics::pvAccess::Channel::ConnectionState connectionState)
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
std::vector< std::pair< std::string, value_pointer > > lock_vector_type
epics::pvData::Status statusConnect
virtual void channelCreated(const epics::pvData::Status &status, epics::pvAccess::Channel::shared_pointer const &channel)
const TestPVChannel::shared_pointer channel
virtual void getDone(const epics::pvData::Status &status, epics::pvAccess::ChannelGet::shared_pointer const &channelGet, epics::pvData::PVStructure::shared_pointer const &pvStructure, epics::pvData::BitSet::shared_pointer const &bitSet)
epics::pvData::Status statusDone
virtual void getField(epics::pvAccess::GetFieldRequester::shared_pointer const &requester, std::string const &subField)
void post(bool notify=true)
epicsGuardRelease< epicsMutex > UnGuard
vector_type lock_vector() const
virtual epics::pvData::Status stop()
std::tr1::weak_ptr< TestPVChannel > weakself
epics::pvData::Status connectStatus
epics::pvData::BitSet::shared_pointer changed
virtual epics::pvAccess::Channel::shared_pointer createChannel(std::string const &channelName, epics::pvAccess::ChannelRequester::shared_pointer const &channelRequester, short priority=PRIORITY_DEFAULT)
std::deque< epics::pvData::MonitorElementPtr > buffer
const ChannelProcessRequester::weak_pointer requester
virtual void putDone(const epics::pvData::Status &status, epics::pvAccess::ChannelPut::shared_pointer const &channelPut)
std::deque< epics::pvData::MonitorElementPtr > free
static const PVDataCreatePtr & getPVDataCreate()
APIs for the epicsEvent binary semaphore.
virtual void getDone(const epics::pvData::Status &status, epics::pvAccess::ChannelPut::shared_pointer const &channelPut, epics::pvData::PVStructure::shared_pointer const &pvStructure, epics::pvData::BitSet::shared_pointer const &bitSet)
std::vector< value_pointer > vector_type
virtual epics::pvAccess::ChannelFind::shared_pointer channelList(epics::pvAccess::ChannelListRequester::shared_pointer const &channelListRequester)
TestPV::shared_pointer addPV(const std::string &name, const epics::pvData::StructureConstPtr &tdef)
virtual ~TestChannelMonitorRequester()
virtual ConnectionState getConnectionState()
epics::pvData::MonitorPtr mon
void testFail(const char *fmt,...)
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
std::string toString(const T &tbs)
virtual void channelGetConnect(const epics::pvData::Status &status, epics::pvAccess::ChannelGet::shared_pointer const &channelGet, epics::pvData::Structure::const_shared_pointer const &structure)
virtual epics::pvData::Status start()
const requester_type::weak_pointer requester
virtual void monitorEvent(epics::pvData::MonitorPtr const &monitor)
epics::pvAccess::Channel::ConnectionState laststate
virtual void monitorConnect(epics::pvData::Status const &status, epics::pvData::MonitorPtr const &monitor, epics::pvData::StructureConstPtr const &structure)
BitSet & set(uint32 bitIndex)
EPICS_ATOMIC_INLINE size_t epicsAtomicIncrSizeT(size_t *pTarget)
void insert(value_pointer &)
virtual bool isConnected()
std::tr1::weak_ptr< TestPVMonitor > weakself
TestChannelGetRequester()
int testOk(int pass, const char *fmt,...)
virtual epics::pvData::MonitorElementPtr poll()
TestPVChannel(const std::tr1::shared_ptr< TestPV > &pv, const std::tr1::shared_ptr< epics::pvAccess::ChannelRequester > &req)
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
std::tr1::shared_ptr< Monitor > MonitorPtr
::epics::pvData::shared_vector< const T > const_svector