pva2pva 1.4.2
Loading...
Searching...
No Matches
PDBGroupPV Struct Reference
Inheritance diagram for PDBGroupPV:
Collaboration diagram for PDBGroupPV:

Classes

struct  Info

Public Types

typedef epics::pvData::shared_vector< Info > members_t
typedef std::set< PDBGroupMonitor * > interested_t
typedef std::set< BaseMonitor::shared_pointer > interested_remove_t

Public Member Functions

 POINTER_DEFINITIONS (PDBGroupPV)
shared_pointer shared_from_this ()
virtual epics::pvAccess::Channel::shared_pointer connect (const std::tr1::shared_ptr< PDBProvider > &prov, const epics::pvAccess::ChannelRequester::shared_pointer &req) OVERRIDE FINAL
void addMonitor (PDBGroupMonitor *)
void removeMonitor (PDBGroupMonitor *)
void finalizeMonitor ()
virtual void show (int lvl) OVERRIDE
Public Member Functions inherited from PDBPV
 POINTER_DEFINITIONS (PDBPV)

Public Attributes

weak_pointer weakself
epics::pvData::BitSet scratch
epicsMutex lock
bool pgatomic
bool monatomic
std::string name
members_t members
DBManyLock locker
epics::pvData::PVStructurePtr complete
bool interested_iterating
interested_t interested
interested_t interested_add
interested_remove_t interested_remove
size_t initial_waits
Public Attributes inherited from PDBPV
epics::pvData::StructureConstPtr fielddesc

Static Public Attributes

static size_t num_instances

Detailed Description

Definition at line 71 of file pdbgroup.h.

Member Typedef Documentation

◆ interested_remove_t

typedef std::set<BaseMonitor::shared_pointer> PDBGroupPV::interested_remove_t

Definition at line 114 of file pdbgroup.h.

◆ interested_t

typedef std::set<PDBGroupMonitor*> PDBGroupPV::interested_t

Definition at line 110 of file pdbgroup.h.

◆ members_t

typedef epics::pvData::shared_vector<Info> PDBGroupPV::members_t

Definition at line 103 of file pdbgroup.h.

Constructor & Destructor Documentation

◆ PDBGroupPV()

PDBGroupPV::PDBGroupPV ( )

Definition at line 123 of file pdbgroup.cpp.

124 :pgatomic(false)
125 ,monatomic(false)
126 ,interested_iterating(false)
127 ,initial_waits(0)
128{
129 epics::atomic::increment(num_instances);
130}

◆ ~PDBGroupPV()

PDBGroupPV::~PDBGroupPV ( )
virtual

Definition at line 132 of file pdbgroup.cpp.

133{
134 epics::atomic::decrement(num_instances);
135}

Member Function Documentation

◆ addMonitor()

void PDBGroupPV::addMonitor ( PDBGroupMonitor * mon)

Definition at line 155 of file pdbgroup.cpp.

156{
157 Guard G(lock);
158 if(interested.empty() && interested_add.empty()) {
159 // first monitor
160 // start subscriptions
161
162 size_t ievts = 0;
163 for(size_t i=0; i<members.size(); i++) {
164 PDBGroupPV::Info& info = members[i];
165
166 if(!!info.evt_VALUE) {
167 db_event_enable(info.evt_VALUE.subscript);
168 db_post_single_event(info.evt_VALUE.subscript);
169 ievts++;
170 info.had_initial_VALUE = false;
171 } else {
172 info.had_initial_VALUE = true;
173 }
174 assert(info.evt_PROPERTY.subscript);
175 db_event_enable(info.evt_PROPERTY.subscript);
176 db_post_single_event(info.evt_PROPERTY.subscript);
177 ievts++;
178 info.had_initial_PROPERTY = false;
179 }
180 initial_waits = ievts;
181
182 } else if(initial_waits==0) {
183 // new subscriber and already had initial update
184 mon->post(G);
185 } // else new subscriber, but no initial update. so just wait
186
187 if(interested_iterating)
188 interested_add.insert(mon);
189 else
190 interested.insert(mon);
191}
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
Definition pvahelper.h:136

◆ connect()

pva::Channel::shared_pointer PDBGroupPV::connect ( const std::tr1::shared_ptr< PDBProvider > & prov,
const epics::pvAccess::ChannelRequester::shared_pointer & req )
virtual

Implements PDBPV.

Definition at line 138 of file pdbgroup.cpp.

140{
141 PDBGroupChannel::shared_pointer ret(new PDBGroupChannel(shared_from_this(), prov, req));
142
143 ret->cred.update(req);
144
145 ret->aspvt.resize(members.size());
146 for(size_t i=0, N=members.size(); i<N; i++)
147 {
148 ret->aspvt[i].add(members[i].chan, ret->cred);
149 }
150
151 return ret;
152}

◆ finalizeMonitor()

void PDBGroupPV::finalizeMonitor ( )

Definition at line 212 of file pdbgroup.cpp.

213{
214 assert(!interested_iterating);
215
216 if(!interested.empty())
217 return;
218
219 // last subscriber
220 for(size_t i=0; i<members.size(); i++) {
221 PDBGroupPV::Info& info = members[i];
222
223 if(!!info.evt_VALUE) {
224 db_event_disable(info.evt_VALUE.subscript);
225 }
226 db_event_disable(info.evt_PROPERTY.subscript);
227 }
228}

◆ removeMonitor()

void PDBGroupPV::removeMonitor ( PDBGroupMonitor * mon)

Definition at line 194 of file pdbgroup.cpp.

195{
196 Guard G(lock);
197
198 if(interested_add.erase(mon)) {
199 // and+remove while iterating. no-op
200
201 } else if(interested_iterating) {
202 // keep the monitor alive until we've finished iterating
203 interested_remove.insert(mon->shared_from_this());
204
205 } else {
206 interested.erase(mon);
207 finalizeMonitor();
208 }
209}

◆ shared_from_this()

shared_pointer PDBGroupPV::shared_from_this ( )
inline

Definition at line 75 of file pdbgroup.h.

75{ return shared_pointer(weakself); }

◆ show()

void PDBGroupPV::show ( int lvl)
virtual

Reimplemented from PDBPV.

Definition at line 230 of file pdbgroup.cpp.

231{
232 // no locking as we only print things which are const after initialization
233
234 printf(" Atomic Get/Put:%s Monitor:%s Members:%zu\n",
235 pgatomic?"yes":"no", monatomic?"yes":"no", members.size());
236
237 if(lvl<=1)
238 return;
239
240 for(members_t::const_iterator it(members.begin()), end(members.end());
241 it != end; ++it)
242 {
243 const Info& info = *it;
244 printf(" ");
245 info.attachment.show(); // printf()s
246 printf("\t<-> %s\n", dbChannelName(info.chan));
247 }
248}

Member Data Documentation

◆ complete

epics::pvData::PVStructurePtr PDBGroupPV::complete

Definition at line 108 of file pdbgroup.h.

◆ initial_waits

size_t PDBGroupPV::initial_waits

Definition at line 117 of file pdbgroup.h.

◆ interested

interested_t PDBGroupPV::interested

Definition at line 112 of file pdbgroup.h.

◆ interested_add

interested_t PDBGroupPV::interested_add

Definition at line 112 of file pdbgroup.h.

◆ interested_iterating

bool PDBGroupPV::interested_iterating

Definition at line 111 of file pdbgroup.h.

◆ interested_remove

interested_remove_t PDBGroupPV::interested_remove

Definition at line 115 of file pdbgroup.h.

◆ lock

epicsMutex PDBGroupPV::lock

Definition at line 81 of file pdbgroup.h.

◆ locker

DBManyLock PDBGroupPV::locker

Definition at line 106 of file pdbgroup.h.

◆ members

members_t PDBGroupPV::members

Definition at line 104 of file pdbgroup.h.

◆ monatomic

bool PDBGroupPV::monatomic

Definition at line 83 of file pdbgroup.h.

◆ name

std::string PDBGroupPV::name

Definition at line 86 of file pdbgroup.h.

◆ num_instances

size_t PDBGroupPV::num_instances
static

Definition at line 119 of file pdbgroup.h.

◆ pgatomic

bool PDBGroupPV::pgatomic

Definition at line 83 of file pdbgroup.h.

◆ scratch

epics::pvData::BitSet PDBGroupPV::scratch

Definition at line 79 of file pdbgroup.h.

◆ weakself

weak_pointer PDBGroupPV::weakself

Definition at line 74 of file pdbgroup.h.


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