This is Unofficial EPICS BASE Doxygen Site
utilities.cpp
Go to the documentation of this file.
1 
2 #include <epicsAtomic.h>
3 #include <errlog.h>
4 #include <epicsEvent.h>
5 #include <epicsUnitTest.h>
6 #include <dbUnitTest.h>
7 
8 #include <pv/pvUnitTest.h>
9 #include <pv/pvAccess.h>
10 
11 #define epicsExportSharedSymbols
12 #include <utilities.h>
13 #include <helper.h>
14 
17 
18 namespace pvd = epics::pvData;
19 namespace pva = epics::pvAccess;
20 
21 static size_t countTestChannelRequester;
22 
24  :laststate(pva::Channel::NEVER_CONNECTED)
25 {
26  epicsAtomicIncrSizeT(&countTestChannelRequester);
27 }
28 
29 
31 {
32  epicsAtomicDecrSizeT(&countTestChannelRequester);
33 }
34 
35 void TestChannelRequester::channelCreated(const pvd::Status& status, pva::Channel::shared_pointer const & channel)
36 {
37  testDiag("channelCreated %s", channel ? channel->getChannelName().c_str() : "<fails>");
38  Guard G(lock);
40  this->status = status;
41  chan = channel;
42  wait.trigger();
43 }
44 
45 void TestChannelRequester::channelStateChange(pva::Channel::shared_pointer const & channel,
46  pva::Channel::ConnectionState connectionState)
47 {
48  testDiag("channelStateChange %s %d", channel->getChannelName().c_str(), (int)connectionState);
49  Guard G(lock);
50  laststate = connectionState;
51  wait.trigger();
52 }
53 
55 {
56  Guard G(lock);
57  assert(chan);
58  while(true) {
59  pva::Channel::ConnectionState cur = chan->getConnectionState();
60  switch(cur) {
62  break;
64  return true;
67  return false;
68  }
69  UnGuard U(G);
70  wait.wait();
71  }
72 
73 }
74 
75 static size_t countTestChannelGetRequester;
76 
78  :connected(false)
79  ,done(false)
80 {
81  epicsAtomicIncrSizeT(&countTestChannelGetRequester);
82 }
83 
85 {
86  epicsAtomicDecrSizeT(&countTestChannelGetRequester);
87 }
88 
90  const epics::pvAccess::ChannelGet::shared_pointer &get,
91  const epics::pvData::Structure::const_shared_pointer &structure)
92 {
93  if(connected)
94  testFail("channelGetConnect() called twice");
96  channelGet = get;
98  connected = true;
99 }
100 
102  const epics::pvAccess::ChannelGet::shared_pointer &get,
103  const epics::pvData::PVStructure::shared_pointer &pvStructure,
104  const epics::pvData::BitSet::shared_pointer &bitSet)
105 {
106  statusDone = status;
107  channelGet = get;
108  value = pvStructure;
109  changed = bitSet;
110  done = true;
111 }
112 
114  :connected(false)
115  ,doneGet(false)
116  ,donePut(false)
117 {}
119 
122  epics::pvAccess::ChannelPut::shared_pointer const & channelPut,
123  epics::pvData::Structure::const_shared_pointer const & structure)
124 {
126  put = channelPut;
128  connected = true;
129 }
130 
133  epics::pvAccess::ChannelPut::shared_pointer const & channelPut)
134 {
135  statusPut = status;
136  put = channelPut;
137  donePut = true;
138 }
139 
142  epics::pvAccess::ChannelPut::shared_pointer const & channelPut,
143  epics::pvData::PVStructure::shared_pointer const & pvStructure,
144  epics::pvData::BitSet::shared_pointer const & bitSet)
145 {
146  statusGet = status;
147  put = channelPut;
148  value = pvStructure;
149  changed = bitSet;
150  doneGet = true;
151 }
152 
153 
154 static size_t countTestChannelMonitorRequester;
155 
157  :connected(false)
158  ,unlistend(false)
159  ,eventCnt(0)
160 {
161  epicsAtomicIncrSizeT(&countTestChannelMonitorRequester);
162 }
163 
165 {
166  epicsAtomicDecrSizeT(&countTestChannelMonitorRequester);
167 }
168 
170  pvd::MonitorPtr const & monitor,
172 {
173  testDiag("monitorConnect %p %d", monitor.get(), (int)status.isSuccess());
174  Guard G(lock);
176  dtype = structure;
177  connected = true;
178  wait.trigger();
179 }
180 
182 {
183  testDiag("monitorEvent %p", monitor.get());
184  mon = monitor;
185  eventCnt++;
186  wait.trigger();
187 }
188 
190 {
191  testDiag("unlisten %p", monitor.get());
192  Guard G(lock);
193  unlistend = true;
194  wait.trigger();
195 }
196 
198 {
199  Guard G(lock);
200  while(!connected) {
201  UnGuard U(G);
202  wait.wait();
203  }
204  return true;
205 }
206 
208 {
209  Guard G(lock);
210  size_t icnt = eventCnt;
211  while(!unlistend && eventCnt==icnt) {
212  UnGuard U(G);
213  wait.wait();
214  }
215  return !unlistend;
216 }
217 
218 static size_t countTestPVChannel;
219 
220 TestPVChannel::TestPVChannel(const std::tr1::shared_ptr<TestPV> &pv,
221  const std::tr1::shared_ptr<pva::ChannelRequester> &req)
222  :BaseChannel(pv->name, pv->provider, req, pv->dtype)
223  ,pv(pv)
224  ,state(CONNECTED)
225 {
226  epicsAtomicIncrSizeT(&countTestPVChannel);
227 }
228 
230 {
231  epicsAtomicDecrSizeT(&countTestPVChannel);
232 }
233 
235 {
236  Guard G(pv->lock);
237  return state;
238 }
239 
240 void TestPVChannel::getField(pva::GetFieldRequester::shared_pointer const & requester,std::string const & subField)
241 {
242  Guard G(pv->lock);
243 
244  //TODO subField?
245  requester->getDone(pvd::Status(), pv->dtype);
246 }
247 
248 pvd::Monitor::shared_pointer
250  pvd::MonitorRequester::shared_pointer const & requester,
251  pvd::PVStructure::shared_pointer const & pvRequest)
252 {
253  shared_pointer self(weakself);
254  TestPVMonitor::shared_pointer ret(new TestPVMonitor(self, requester, 2));
255  {
256  Guard G(pv->lock);
257  monitors.insert(ret);
258  static_cast<TestPVMonitor*>(ret.get())->weakself = ret; // save wrapped weak ref
259  }
260  testDiag("TestPVChannel::createMonitor %s %p", pv->name.c_str(), ret.get());
261  requester->monitorConnect(pvd::Status(), ret, pv->dtype);
262  return ret;
263 }
264 
265 static size_t countTestPVMonitor;
266 
267 TestPVMonitor::TestPVMonitor(const TestPVChannel::shared_pointer& ch,
268  const pvd::MonitorRequester::shared_pointer& req,
269  size_t bsize)
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 }
286 
288 {
289  epicsAtomicDecrSizeT(&countTestPVMonitor);
290 }
291 
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 }
299 
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 }
347 
349 {
350  testDiag("TestPVMonitor::stop %p", this);
351  Guard G(channel->pv->lock);
352  running = false;
353  return pvd::Status();
354 }
355 
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 }
367 
368 void TestPVMonitor::release(pva::MonitorElementPtr const & monitorElement)
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 }
391 
392 static size_t countTestPV;
393 
394 TestPV::TestPV(const std::string& name,
395  const std::tr1::shared_ptr<TestProvider>& provider,
396  const pvd::StructureConstPtr& dtype)
397  :name(name)
398  ,provider(provider)
399  ,factory(pvd::PVDataCreate::getPVDataCreate())
400  ,dtype(dtype)
401  ,value(factory->createPVStructure(dtype))
402 {
403  epicsAtomicIncrSizeT(&countTestPV);
404 }
405 
407 {
408  epicsAtomicDecrSizeT(&countTestPV);
409 }
410 
411 void TestPV::post(bool notify)
412 {
413  pvd::BitSet changed;
414  changed.set(0); // all
415  post(changed, notify);
416 }
417 
418 void TestPV::post(const pvd::BitSet& changed, bool notify)
419 {
420  testDiag("post %s %d changed '%s'", name.c_str(), (int)notify, toString(changed).c_str());
421  Guard G(lock);
422 
424 
425  FOREACH(channels_t::vector_type::const_iterator, it, end, toupdate) // channel
426  {
427  TestPVChannel *chan = it->get();
428 
430  FOREACH(TestPVChannel::monitors_t::vector_type::const_iterator, it2, end2, tomon) // monitor/subscription
431  {
432  TestPVMonitor *mon = it2->get();
433 
434  if(!mon->running)
435  continue;
436 
437  mon->overflow->pvStructurePtr->copyUnchecked(*value, changed);
438 
439  if(mon->free.empty()) {
440  mon->inoverflow = true;
441  mon->overflow->overrunBitSet->or_and(*mon->overflow->changedBitSet, changed); // oflow |= prev_changed & new_changed
442  *mon->overflow->changedBitSet |= changed;
443  testDiag("overflow changed '%s' overrun '%s'",
444  toString(*mon->overflow->changedBitSet).c_str(),
445  toString(*mon->overflow->overrunBitSet).c_str());
446 
447  } else {
448  assert(!mon->inoverflow);
449 
450  if(mon->buffer.empty())
451  mon->needWakeup = true;
452 
453  pvd::MonitorElementPtr& elem(mon->free.front());
454  // Note: can't use 'changed' to optimize this copy since we don't know
455  // the state of the free element
456  elem->pvStructurePtr->copyUnchecked(*mon->overflow->pvStructurePtr);
457  *elem->changedBitSet = changed;
458  elem->overrunBitSet->clear(); // redundant/paranoia
459 
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());
465  }
466 
467  if(mon->needWakeup && notify) {
468  testDiag(" wakeup");
469  mon->needWakeup = false;
470  pva::MonitorRequester::shared_pointer req(mon->requester.lock());
471  UnGuard U(G);
472  if(req)
473  req->monitorEvent(*it2);
474  }
475  }
476  }
477 }
478 
480 {
481  Guard G(lock);
483 
484  FOREACH(channels_t::vector_type::const_iterator, it, end, toupdate) // channel
485  {
486  TestPVChannel *chan = it->get();
487 
489  {
490  pva::ChannelRequester::shared_pointer req(chan->requester.lock());
491  UnGuard U(G);
492  if(req)
493  req->channelStateChange(*it, TestPVChannel::DISCONNECTED);
494  }
495  }
496 }
497 
498 static size_t countTestProvider;
499 
501 {
502  epicsAtomicIncrSizeT(&countTestProvider);
503 }
504 
506 {
507  epicsAtomicDecrSizeT(&countTestProvider);
508 }
509 
511 {
512  // TODO: disconnect all?
513 }
514 
515 pva::ChannelFind::shared_pointer
516 TestProvider::channelList(pva::ChannelListRequester::shared_pointer const & requester)
517 {
518  pva::ChannelFind::shared_pointer ret;
520  requester->channelListResult(pvd::Status(pvd::Status::STATUSTYPE_FATAL, "Not implemented"),
521  ret,
522  names,
523  true);
524  return ret;
525 }
526 
527 pva::ChannelFind::shared_pointer
528 TestProvider::channelFind(std::string const & channelName,
529  pva::ChannelFindRequester::shared_pointer const & requester)
530 {
531  pva::ChannelFind::shared_pointer ret;
532  requester->channelFindResult(pvd::Status(pvd::Status::STATUSTYPE_FATAL, "Not implemented"),
533  ret, false);
534  return ret;
535 }
536 
537 pva::Channel::shared_pointer
538 TestProvider::createChannel(std::string const & channelName,pva::ChannelRequester::shared_pointer const & requester,
539  short priority)
540 {
541  return createChannel(channelName, requester, priority, "<unused>");
542 }
543 
544 pva::Channel::shared_pointer
545 TestProvider::createChannel(std::string const & channelName,
546  pva::ChannelRequester::shared_pointer const & requester,
547  short priority, std::string const & address)
548 {
549  pva::Channel::shared_pointer ret;
550 
551  {
552  Guard G(lock);
553 
554  TestPV::shared_pointer pv(pvs.find(channelName));
555  if(pv) {
556  TestPVChannel::shared_pointer chan(new TestPVChannel(pv, requester));
557  pv->channels.insert(chan);
558  chan->weakself = chan;
559  ret = chan;
560  }
561  }
562 
563  if(ret) {
564  requester->channelCreated(pvd::Status(), ret);
565  } else {
566  requester->channelCreated(pvd::Status(pvd::Status::STATUSTYPE_ERROR, "PV not found"), ret);
567  }
568  testDiag("createChannel %s %p", channelName.c_str(), ret.get());
569  return ret;
570 }
571 
572 TestPV::shared_pointer
573 TestProvider::addPV(const std::string& name, const pvd::StructureConstPtr& tdef)
574 {
575  Guard G(lock);
576  TestPV::shared_pointer ret(new TestPV(name, shared_from_this(), tdef));
577  pvs.insert(name, ret);
578  return ret;
579 }
580 
582 {
583  Guard G(lock);
584  testDiag("TestProvider::dispatch");
585 
586  pvs_t::lock_vector_type allpvs(pvs.lock_vector());
587  FOREACH(pvs_t::lock_vector_type::const_iterator, pvit, pvend, allpvs)
588  {
589  TestPV *pv = pvit->second.get();
591 
592  FOREACH(TestPV::channels_t::vector_type::const_iterator, chit, chend, channels)
593  {
594  TestPVChannel *chan = chit->get();
596 
597  if(!chan->isConnected())
598  continue;
599 
600  FOREACH(TestPVChannel::monitors_t::vector_type::const_iterator, monit, monend, monitors)
601  {
602  TestPVMonitor *mon = monit->get();
603 
604  if(mon->finalize || !mon->running)
605  continue;
606 
607  if(mon->needWakeup) {
608  testDiag(" wakeup monitor %p", mon);
609  mon->needWakeup = false;
610  pva::MonitorRequester::shared_pointer req(mon->requester.lock());
611  UnGuard U(G);
612  if(req)
613  req->monitorEvent(*monit);
614  }
615  }
616  }
617  }
618 }
619 
621 {
622  int ok = 1;
623  size_t temp;
624 #define TESTC(name) temp=epicsAtomicGetSizeT(&count##name); ok &= temp==0; testDiag("num. live " #name " %u", (unsigned)temp)
628  TESTC(TestPV);
631 #undef TESTC
632  testOk(ok, "All instances free'd");
633 }
virtual void unlisten(epics::pvData::MonitorPtr const &monitor)
Definition: utilities.cpp:189
epics::pvData::BitSet::shared_pointer changed
Definition: utilities.h:109
virtual void release(epics::pvData::MonitorElementPtr const &monitorElement)
Definition: utilities.cpp:368
virtual ~TestChannelGetRequester()
Definition: utilities.cpp:84
monitors_t monitors
Definition: utilities.h:194
epics::pvAccess::ChannelGet::shared_pointer channelGet
Definition: utilities.h:106
epics::pvData::Status status
Definition: utilities.h:67
Definition: link.h:174
virtual epics::pvData::Monitor::shared_pointer createMonitor(epics::pvData::MonitorRequester::shared_pointer const &monitorRequester, epics::pvData::PVStructure::shared_pointer const &pvRequest)
Definition: utilities.cpp:249
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
ConnectionState state
Definition: utilities.h:191
epics::pvData::Status statusPut
Definition: utilities.h:132
BitSet & clear(uint32 bitIndex)
Definition: bitSet.cpp:112
#define FOREACH(ITERTYPE, IT, END, C)
Definition: helper.h:6
epics::pvData::Status statusGet
Definition: utilities.h:132
pvd::Status status
epics::pvAccess::Channel::shared_pointer chan
Definition: utilities.h:66
TestPVMonitor(const TestPVChannel::shared_pointer &ch, const epics::pvData::MonitorRequester::shared_pointer &req, size_t bsize)
Definition: utilities.cpp:267
int i
Definition: scan.c:967
const epics::pvData::MonitorRequester::weak_pointer requester
Definition: utilities.h:216
virtual ~TestProvider()
Definition: utilities.cpp:505
virtual ~TestChannelPutRequester()
Definition: utilities.cpp:118
epics::pvAccess::ChannelPut::shared_pointer put
Definition: utilities.h:133
Definition: tool_lib.h:67
TestPV(const std::string &name, const std::tr1::shared_ptr< TestProvider > &provider, const epics::pvData::StructureConstPtr &dtype)
Definition: utilities.cpp:394
epics::pvData::MonitorElementPtr overflow
Definition: utilities.h:236
virtual epics::pvAccess::ChannelFind::shared_pointer channelFind(std::string const &channelName, epics::pvAccess::ChannelFindRequester::shared_pointer const &channelFindRequester)
Definition: utilities.cpp:528
virtual void destroy()
Definition: utilities.cpp:510
virtual void channelPutConnect(const epics::pvData::Status &status, epics::pvAccess::ChannelPut::shared_pointer const &channelPut, epics::pvData::Structure::const_shared_pointer const &structure)
Definition: utilities.cpp:120
epicsGuard< epicsMutex > Guard
Definition: utilities.cpp:15
std::tr1::shared_ptr< const Structure > StructureConstPtr
Definition: pvIntrospect.h:162
epics::pvData::Status statusConnect
Definition: utilities.h:105
int testDiag(const char *fmt,...)
virtual ~TestChannelRequester()
Definition: utilities.cpp:30
A vector of bits.
Definition: bitSet.h:56
An element for a monitorQueue.
Definition: monitor.h:54
epics::pvData::Structure::const_shared_pointer fielddesc
Definition: utilities.h:107
#define TESTC(name)
EPICS_ATOMIC_INLINE size_t epicsAtomicDecrSizeT(size_t *pTarget)
epics::pvData::StructureConstPtr dtype
Definition: utilities.h:169
epics::pvData::Structure::const_shared_pointer fielddesc
Definition: utilities.h:134
virtual void channelStateChange(epics::pvAccess::Channel::shared_pointer const &channel, epics::pvAccess::Channel::ConnectionState connectionState)
Definition: utilities.cpp:45
channels_t channels
Definition: utilities.h:265
epicsEvent wait
Definition: utilities.h:65
epicsMutex lock
Definition: utilities.h:262
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
Definition: pvData.h:124
std::vector< std::pair< std::string, value_pointer > > lock_vector_type
Definition: weakmap.h:256
epics::pvData::Status statusConnect
Definition: utilities.h:132
virtual void channelCreated(const epics::pvData::Status &status, epics::pvAccess::Channel::shared_pointer const &channel)
Definition: utilities.cpp:35
const TestPVChannel::shared_pointer channel
Definition: utilities.h:215
Holds all PVA related.
Definition: pvif.h:34
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)
Definition: utilities.cpp:101
epics::pvData::Status statusDone
Definition: utilities.h:105
virtual void getField(epics::pvAccess::GetFieldRequester::shared_pointer const &requester, std::string const &subField)
Definition: utilities.cpp:240
pvData
Definition: monitor.h:428
void post(bool notify=true)
Definition: utilities.cpp:411
epicsGuardRelease< epicsMutex > UnGuard
Definition: utilities.cpp:16
vector_type lock_vector() const
Definition: weakset.h:268
virtual epics::pvData::Status stop()
Definition: utilities.cpp:348
std::tr1::weak_ptr< TestPVChannel > weakself
Definition: utilities.h:188
epics::pvData::Status connectStatus
Definition: utilities.h:167
epics::pvData::BitSet::shared_pointer changed
Definition: utilities.h:136
bool needWakeup
Definition: utilities.h:221
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
Definition: utilities.h:235
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
bool isSuccess() const
Definition: status.h:103
const std::string name
Definition: utilities.h:244
virtual void putDone(const epics::pvData::Status &status, epics::pvAccess::ChannelPut::shared_pointer const &channelPut)
Definition: utilities.cpp:131
epicsMutex lock
Definition: utilities.h:64
virtual ~TestPVMonitor()
Definition: utilities.cpp:287
void disconnect()
Definition: utilities.cpp:479
std::deque< epics::pvData::MonitorElementPtr > free
Definition: utilities.h:235
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)
Definition: utilities.cpp:140
virtual void destroy()
Definition: utilities.cpp:292
static void testCounts()
Definition: utilities.cpp:620
std::vector< value_pointer > vector_type
Definition: weakset.h:64
void dispatch()
Definition: utilities.cpp:581
virtual epics::pvAccess::ChannelFind::shared_pointer channelList(epics::pvAccess::ChannelListRequester::shared_pointer const &channelListRequester)
Definition: utilities.cpp:516
Unit test routines.
TestPV::shared_pointer addPV(const std::string &name, const epics::pvData::StructureConstPtr &tdef)
Definition: utilities.cpp:573
void done(int k)
Definition: antelope.c:77
virtual ~TestChannelMonitorRequester()
Definition: utilities.cpp:164
bool inoverflow
Definition: utilities.h:220
virtual ConnectionState getConnectionState()
Definition: utilities.cpp:234
epics::pvData::MonitorPtr mon
Definition: utilities.h:168
void testFail(const char *fmt,...)
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
Definition: monitor.h:40
std::string toString(const T &tbs)
Definition: utilities.h:31
virtual void channelGetConnect(const epics::pvData::Status &status, epics::pvAccess::ChannelGet::shared_pointer const &channelGet, epics::pvData::Structure::const_shared_pointer const &structure)
Definition: utilities.cpp:89
virtual epics::pvData::Status start()
Definition: utilities.cpp:300
const requester_type::weak_pointer requester
Definition: pvahelper.h:35
char * name
Definition: tool_lib.h:69
virtual void monitorEvent(epics::pvData::MonitorPtr const &monitor)
Definition: utilities.cpp:181
epics::pvAccess::Channel::ConnectionState laststate
Definition: utilities.h:68
virtual void monitorConnect(epics::pvData::Status const &status, epics::pvData::MonitorPtr const &monitor, epics::pvData::StructureConstPtr const &structure)
Definition: utilities.cpp:169
BitSet & set(uint32 bitIndex)
Definition: bitSet.cpp:103
virtual ~TestPVChannel()
Definition: utilities.cpp:229
EPICS_ATOMIC_INLINE size_t epicsAtomicIncrSizeT(size_t *pTarget)
void insert(value_pointer &)
Definition: weakset.h:227
virtual bool isConnected()
Definition: pvAccess.cpp:49
std::tr1::weak_ptr< TestPVMonitor > weakself
Definition: utilities.h:213
int testOk(int pass, const char *fmt,...)
virtual epics::pvData::MonitorElementPtr poll()
Definition: utilities.cpp:356
TestPVChannel(const std::tr1::shared_ptr< TestPV > &pv, const std::tr1::shared_ptr< epics::pvAccess::ChannelRequester > &req)
Definition: utilities.cpp:220
#define false
Definition: flexdef.h:85
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
std::tr1::shared_ptr< Monitor > MonitorPtr
Definition: monitor.h:44
::epics::pvData::shared_vector< const T > const_svector
Definition: pvData.h:1185