31 int eventsRemaining,
struct db_field_log *pfl)
34 unsigned idx = evt->
index;
44 self->scratch.clear();
48 self->members[idx].pvif->put(self->scratch, evt->
dbe_mask, pfl);
53 DBManyLocker L(info.
locker);
54 FOREACH(PDBGroupPV::Info::triggers_t::const_iterator, it, end, info.
triggers)
59 self->members[
i].pvif->put(self->scratch, evt->
dbe_mask, FL.
pfl);
66 assert(self->initial_waits>0);
67 self->initial_waits--;
72 assert(self->initial_waits>0);
73 self->initial_waits--;
77 if(self->initial_waits==0) {
78 self->interested_iterating =
true;
80 FOREACH(PDBGroupPV::interested_t::const_iterator, it, end, self->interested) {
82 mon.
post(G, self->scratch);
88 assert(self->interested_iterating);
90 while(!self->interested_add.empty()) {
91 PDBGroupPV::interested_t::iterator first(self->interested_add.begin());
92 self->interested.insert(*first);
93 self->interested_add.erase(first);
96 temp.swap(self->interested_remove);
97 for(PDBGroupPV::interested_remove_t::iterator it(temp.begin()),
98 end(temp.end()); it != end; ++it)
100 self->interested.erase(static_cast<PDBGroupMonitor*>(it->get()));
103 self->interested_iterating =
false;
105 self->finalizeMonitor();
110 }
catch(std::tr1::bad_weak_ptr&){
116 }
catch(std::exception& e){
117 std::cerr<<
"Unhandled exception in pdb_group_event(): "<<e.what()<<
"\n" 125 ,interested_iterating(
false)
136 pva::Channel::shared_pointer
138 const pva::ChannelRequester::shared_pointer& req)
142 ret->cred.update(req);
147 ret->aspvt[
i].add(
members[
i].chan, ret->cred);
233 printf(
" Atomic Get/Put:%s Monitor:%s Members:%zu\n",
242 const Info& info = *it;
245 printf(
"\t<-> %s\n", dbChannelName(info.
chan));
251 const std::tr1::shared_ptr<pva::ChannelProvider>& prov,
252 const pva::ChannelRequester::shared_pointer& req)
266 out<<
"PDBGroupChannel";
269 pva::ChannelPut::shared_pointer
271 pva::ChannelPutRequester::shared_pointer
const &
requester,
272 pvd::PVStructure::shared_pointer
const & pvRequest)
274 PDBGroupPut::shared_pointer ret(
new PDBGroupPut(shared_from_this(), requester, pvRequest));
279 pva::Monitor::shared_pointer
281 pva::MonitorRequester::shared_pointer
const &
requester,
282 pvd::PVStructure::shared_pointer
const & pvRequest)
288 ret->connect(G,
pv->complete);
295 const requester_type::shared_pointer&
requester,
296 const epics::pvData::PVStructure::shared_pointer &pvReq)
298 ,requester(requester)
299 ,atomic(channel->
pv->pgatomic)
301 ,doProc(
PVIF::ProcPassive)
302 ,changed(new
pvd::BitSet(channel->
fielddesc->getNumberFields()))
307 getS<pvd::boolean>(pvReq,
"record._options.atomic",
atomic);
309 getS<pvd::boolean>(pvReq,
"record._options.block",
doWait);
312 if(getS<std::string>(pvReq,
"record._options.process", proccmd)) {
313 if(proccmd==
"true") {
315 }
else if(proccmd==
"false") {
318 }
else if(proccmd==
"passive") {
324 }
catch(std::exception& e){
325 requester->message(std::string(
"Error processing request options: ")+e.what());
331 const size_t npvs = channel->pv->members.size();
333 for(
size_t i=0;
i<npvs;
i++)
347 pvd::BitSet::shared_pointer
const &
changed)
350 const size_t npvs =
channel->pv->members.size();
351 std::vector<std::tr1::shared_ptr<PVIF> > putpvif(npvs);
353 for(
size_t i=0;
i<npvs;
i++)
363 DBManyLocker L(
channel->pv->locker);
364 for(
size_t i=0; ret &&
i<npvs;
i++) {
365 if(!putpvif[
i].
get())
continue;
367 ret |= putpvif[
i]->get(*changed,
doProc);
371 for(
size_t i=0; ret &&
i<npvs;
i++)
373 if(!putpvif[
i].
get())
continue;
379 ret |= putpvif[
i]->get(*changed,
385 requester_type::shared_pointer req(
requester.lock());
387 req->putDone(ret, shared_from_this());
392 const size_t npvs =
pvif.size();
396 DBManyLocker L(
channel->pv->locker);
397 for(
size_t i=0;
i<npvs;
i++)
401 for(
size_t i=0;
i<npvs;
i++)
413 requester_type::shared_pointer req(
requester.lock());
419 const epics::pvAccess::MonitorRequester::weak_pointer &
requester,
420 const pvd::PVStructure::shared_pointer& pvReq)
436 PDBGroupPV::shared_pointer
pv;
445 pv->addMonitor(
this);
450 pv->removeMonitor(
this);
std::vector< std::tr1::shared_ptr< PVIF > > pvif
epics::pvData::PVStructurePtr pvf
PDBGroupPV::shared_pointer pv
#define assert(exp)
Declare that a condition should be true.
dbEventSubscription subscript
static size_t num_instances
#define FOREACH(ITERTYPE, IT, END, C)
void pdb_group_event(void *user_arg, struct dbChannel *chan, int eventsRemaining, struct db_field_log *pfl)
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
virtual epics::pvData::Monitor::shared_pointer createMonitor(epics::pvData::MonitorRequester::shared_pointer const &requester, epics::pvData::PVStructure::shared_pointer const &pvRequest) OVERRIDE FINAL
virtual epics::pvAccess::ChannelPut::shared_pointer createChannelPut(epics::pvAccess::ChannelPutRequester::shared_pointer const &requester, epics::pvData::PVStructure::shared_pointer const &pvRequest) OVERRIDE FINAL
std::set< BaseMonitor::shared_pointer > interested_remove_t
virtual epics::pvAccess::Channel::shared_pointer connect(const std::tr1::shared_ptr< PDBProvider > &prov, const epics::pvAccess::ChannelRequester::shared_pointer &req) OVERRIDE FINAL
interested_t interested_add
static size_t num_instances
virtual void get() OVERRIDE FINAL
PDBGroupPut(const PDBGroupChannel::shared_pointer &channel, const epics::pvAccess::ChannelPutRequester::shared_pointer &requester, const epics::pvData::PVStructure::shared_pointer &pvReq)
virtual void destroy() OVERRIDE FINAL
#define SHOW_EXCEPTION(EI)
epics::pvData::StructureConstPtr fielddesc
PDBGroupChannel(const PDBGroupPV::shared_pointer &pv, const std::tr1::shared_ptr< epics::pvAccess::ChannelProvider > &prov, const epics::pvAccess::ChannelRequester::shared_pointer &req)
bool had_initial_PROPERTY
shared_pointer shared_from_this()
PDBGroupChannel::shared_pointer channel
interested_remove_t interested_remove
virtual void onStop() OVERRIDE FINAL
virtual void onStart() OVERRIDE FINAL
virtual ~PDBGroupMonitor()
void addMonitor(PDBGroupMonitor *)
meta::decorate_const< Info >::type * const_iterator
virtual void show(int lvl) OVERRIDE
bool interested_iterating
size_t size() const
Number of elements visible through this vector.
epics::pvData::BitSetPtr changed
requester_type::weak_pointer requester
void removeMonitor(PDBGroupMonitor *)
bool post(guard_t &guard, const epics::pvData::BitSet &updated, no_overflow)
post update if queue not full, if full return false w/o overflow
shared_pointer shared_from_this()
static size_t num_instances
Class that holds the data for each possible scalar type.
PDBGroupMonitor(const PDBGroupPV::shared_pointer &pv, const requester_type::weak_pointer &requester, const epics::pvData::PVStructure::shared_pointer &pvReq)
const requester_type::weak_pointer requester
epicsGuard< epicsMutex > Guard
virtual void requestUpdate() OVERRIDE FINAL
virtual ~PDBGroupChannel()
std::tr1::shared_ptr< PVIFBuilder > builder
static size_t num_instances
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
const epics::pvData::StructureConstPtr fielddesc
virtual void put(epics::pvData::PVStructure::shared_pointer const &pvPutStructure, epics::pvData::BitSet::shared_pointer const &putBitSet) OVERRIDE FINAL