This is Unofficial EPICS BASE Doxygen Site
PDBGroupPV Struct Reference

#include "pdbgroup.h"

+ Inheritance diagram for PDBGroupPV:
+ Collaboration diagram for PDBGroupPV:

Classes

struct  Info
 

Public Types

typedef epics::pvData::shared_vector< Infomembers_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 ()
 
 PDBGroupPV ()
 
virtual ~PDBGroupPV ()
 
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)
 
 PDBPV ()
 
virtual ~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 73 of file pdbgroup.h.

Member Typedef Documentation

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

Definition at line 114 of file pdbgroup.h.

Definition at line 110 of file pdbgroup.h.

Constructor & Destructor Documentation

PDBGroupPV::PDBGroupPV ( )

Definition at line 122 of file pdbgroup.cpp.

123  :pgatomic(false)
124  ,monatomic(false)
125  ,interested_iterating(false)
126  ,initial_waits(0)
127 {
128  epics::atomic::increment(num_instances);
129 }
bool monatomic
Definition: pdbgroup.h:85
size_t initial_waits
Definition: pdbgroup.h:117
bool interested_iterating
Definition: pdbgroup.h:111
static size_t num_instances
Definition: pdbgroup.h:119
bool pgatomic
Definition: pdbgroup.h:85
PDBGroupPV::~PDBGroupPV ( )
virtual

Definition at line 131 of file pdbgroup.cpp.

132 {
133  epics::atomic::decrement(num_instances);
134 }
static size_t num_instances
Definition: pdbgroup.h:119

Member Function Documentation

void PDBGroupPV::addMonitor ( PDBGroupMonitor mon)

Definition at line 154 of file pdbgroup.cpp.

155 {
156  Guard G(lock);
157  if(interested.empty() && interested_add.empty()) {
158  // first monitor
159  // start subscriptions
160 
161  size_t ievts = 0;
162  for(size_t i=0; i<members.size(); i++) {
163  PDBGroupPV::Info& info = members[i];
164 
165  if(!!info.evt_VALUE) {
166  db_event_enable(info.evt_VALUE.subscript);
167  db_post_single_event(info.evt_VALUE.subscript);
168  ievts++;
169  info.had_initial_VALUE = false;
170  } else {
171  info.had_initial_VALUE = true;
172  }
174  db_event_enable(info.evt_PROPERTY.subscript);
175  db_post_single_event(info.evt_PROPERTY.subscript);
176  ievts++;
177  info.had_initial_PROPERTY = false;
178  }
179  initial_waits = ievts;
180 
181  } else if(initial_waits==0) {
182  // new subscriber and already had initial update
183  mon->post(G);
184  } // else new subscriber, but no initial update. so just wait
185 
187  interested_add.insert(mon);
188  else
189  interested.insert(mon);
190 }
members_t members
Definition: pdbgroup.h:104
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
dbEventSubscription subscript
Definition: pvif.h:216
int i
Definition: scan.c:967
interested_t interested_add
Definition: pdbgroup.h:112
size_t initial_waits
Definition: pdbgroup.h:117
bool had_initial_PROPERTY
Definition: pdbgroup.h:99
bool interested_iterating
Definition: pdbgroup.h:111
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220
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
DBEvent evt_VALUE
Definition: pdbgroup.h:98
bool had_initial_VALUE
Definition: pdbgroup.h:99
interested_t interested
Definition: pdbgroup.h:112
DBEvent evt_PROPERTY
Definition: pdbgroup.h:98
epicsMutex lock
Definition: pdbgroup.h:83
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 137 of file pdbgroup.cpp.

139 {
140  PDBGroupChannel::shared_pointer ret(new PDBGroupChannel(shared_from_this(), prov, req));
141 
142  ret->cred.update(req);
143 
144  ret->aspvt.resize(members.size());
145  for(size_t i=0, N=members.size(); i<N; i++)
146  {
147  ret->aspvt[i].add(members[i].chan, ret->cred);
148  }
149 
150  return ret;
151 }
members_t members
Definition: pdbgroup.h:104
int i
Definition: scan.c:967
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220
shared_pointer shared_from_this()
Definition: pdbgroup.h:77
void PDBGroupPV::finalizeMonitor ( )

Definition at line 211 of file pdbgroup.cpp.

212 {
214 
215  if(!interested.empty())
216  return;
217 
218  // last subscriber
219  for(size_t i=0; i<members.size(); i++) {
220  PDBGroupPV::Info& info = members[i];
221 
222  if(!!info.evt_VALUE) {
223  db_event_disable(info.evt_VALUE.subscript);
224  }
225  db_event_disable(info.evt_PROPERTY.subscript);
226  }
227 }
members_t members
Definition: pdbgroup.h:104
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
dbEventSubscription subscript
Definition: pvif.h:216
int i
Definition: scan.c:967
bool interested_iterating
Definition: pdbgroup.h:111
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220
DBEvent evt_VALUE
Definition: pdbgroup.h:98
interested_t interested
Definition: pdbgroup.h:112
DBEvent evt_PROPERTY
Definition: pdbgroup.h:98
PDBGroupPV::POINTER_DEFINITIONS ( PDBGroupPV  )
void PDBGroupPV::removeMonitor ( PDBGroupMonitor mon)

Definition at line 193 of file pdbgroup.cpp.

194 {
195  Guard G(lock);
196 
197  if(interested_add.erase(mon)) {
198  // and+remove while iterating. no-op
199 
200  } else if(interested_iterating) {
201  // keep the monitor alive until we've finished iterating
202  interested_remove.insert(mon->shared_from_this());
203 
204  } else {
205  interested.erase(mon);
206  finalizeMonitor();
207  }
208 }
interested_t interested_add
Definition: pdbgroup.h:112
shared_pointer shared_from_this()
Definition: pvahelper.h:73
interested_remove_t interested_remove
Definition: pdbgroup.h:115
bool interested_iterating
Definition: pdbgroup.h:111
void finalizeMonitor()
Definition: pdbgroup.cpp:211
interested_t interested
Definition: pdbgroup.h:112
epicsMutex lock
Definition: pdbgroup.h:83
shared_pointer PDBGroupPV::shared_from_this ( )
inline

Definition at line 77 of file pdbgroup.h.

77 { return shared_pointer(weakself); }
weak_pointer weakself
Definition: pdbgroup.h:76
void PDBGroupPV::show ( int  lvl)
virtual

Reimplemented from PDBPV.

Definition at line 229 of file pdbgroup.cpp.

230 {
231  // no locking as we only print things which are const after initialization
232 
233  printf(" Atomic Get/Put:%s Monitor:%s Members:%zu\n",
234  pgatomic?"yes":"no", monatomic?"yes":"no", members.size());
235 
236  if(lvl<=1)
237  return;
238 
240  it != end; ++it)
241  {
242  const Info& info = *it;
243  printf(" ");
244  info.attachment.show(); // printf()s
245  printf("\t<-> %s\n", dbChannelName(info.chan));
246  }
247 }
members_t members
Definition: pdbgroup.h:104
bool monatomic
Definition: pdbgroup.h:85
#define printf
Definition: epicsStdio.h:41
meta::decorate_const< Info >::type * const_iterator
Definition: sharedVector.h:300
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220
bool pgatomic
Definition: pdbgroup.h:85

Member Data Documentation

epics::pvData::PVStructurePtr PDBGroupPV::complete

Definition at line 108 of file pdbgroup.h.

size_t PDBGroupPV::initial_waits

Definition at line 117 of file pdbgroup.h.

interested_t PDBGroupPV::interested

Definition at line 112 of file pdbgroup.h.

interested_t PDBGroupPV::interested_add

Definition at line 112 of file pdbgroup.h.

bool PDBGroupPV::interested_iterating

Definition at line 111 of file pdbgroup.h.

interested_remove_t PDBGroupPV::interested_remove

Definition at line 115 of file pdbgroup.h.

epicsMutex PDBGroupPV::lock

Definition at line 83 of file pdbgroup.h.

DBManyLock PDBGroupPV::locker

Definition at line 106 of file pdbgroup.h.

members_t PDBGroupPV::members

Definition at line 104 of file pdbgroup.h.

bool PDBGroupPV::monatomic

Definition at line 85 of file pdbgroup.h.

std::string PDBGroupPV::name

Definition at line 88 of file pdbgroup.h.

size_t PDBGroupPV::num_instances
static

Definition at line 119 of file pdbgroup.h.

bool PDBGroupPV::pgatomic

Definition at line 85 of file pdbgroup.h.

epics::pvData::BitSet PDBGroupPV::scratch

Definition at line 81 of file pdbgroup.h.

weak_pointer PDBGroupPV::weakself

Definition at line 76 of file pdbgroup.h.


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