This is Unofficial EPICS BASE Doxygen Site
PDBGroupPut Struct Reference

#include "pdbgroup.h"

+ Inheritance diagram for PDBGroupPut:
+ Collaboration diagram for PDBGroupPut:

Public Types

typedef epics::pvAccess::ChannelPutRequester requester_t
 
- Public Types inherited from epics::pvAccess::ChannelPut
typedef ChannelPutRequester requester_type
 

Public Member Functions

 POINTER_DEFINITIONS (PDBGroupPut)
 
 PDBGroupPut (const PDBGroupChannel::shared_pointer &channel, const epics::pvAccess::ChannelPutRequester::shared_pointer &requester, const epics::pvData::PVStructure::shared_pointer &pvReq)
 
virtual ~PDBGroupPut ()
 
virtual void destroy () OVERRIDE FINAL
 
virtual std::tr1::shared_ptr< epics::pvAccess::ChannelgetChannel () OVERRIDE FINAL
 
virtual void cancel () OVERRIDE FINAL
 
virtual void lastRequest () OVERRIDE FINAL
 
virtual void put (epics::pvData::PVStructure::shared_pointer const &pvPutStructure, epics::pvData::BitSet::shared_pointer const &putBitSet) OVERRIDE FINAL
 
virtual void get () OVERRIDE FINAL
 
- Public Member Functions inherited from epics::pvAccess::ChannelPut
 POINTER_DEFINITIONS (ChannelPut)
 
virtual ~ChannelPut ()
 
- Public Member Functions inherited from epics::pvAccess::ChannelRequest
 POINTER_DEFINITIONS (ChannelRequest)
 
 ChannelRequest ()
 
virtual ~ChannelRequest ()
 
- Public Member Functions inherited from epics::pvAccess::Destroyable
 POINTER_DEFINITIONS (Destroyable)
 
- Public Member Functions inherited from epics::pvAccess::Lockable
 POINTER_DEFINITIONS (Lockable)
 
virtual ~Lockable ()
 
virtual void lock ()
 
virtual void unlock ()
 

Public Attributes

PDBGroupChannel::shared_pointer channel
 
requester_type::weak_pointer requester
 
bool atomic
 
bool doWait
 
PVIF::proc_t doProc
 
epics::pvData::BitSetPtr changed
 
epics::pvData::PVStructurePtr pvf
 
std::vector< std::tr1::shared_ptr< PVIF > > pvif
 

Static Public Attributes

static size_t num_instances
 
- Static Public Attributes inherited from epics::pvAccess::ChannelRequest
static size_t num_instances
 

Additional Inherited Members

- Protected Member Functions inherited from epics::pvAccess::Destroyable
virtual ~Destroyable ()
 

Detailed Description

Definition at line 163 of file pdbgroup.h.

Member Typedef Documentation

Constructor & Destructor Documentation

PDBGroupPut::PDBGroupPut ( const PDBGroupChannel::shared_pointer &  channel,
const epics::pvAccess::ChannelPutRequester::shared_pointer &  requester,
const epics::pvData::PVStructure::shared_pointer &  pvReq 
)

Definition at line 294 of file pdbgroup.cpp.

297  :channel(channel)
299  ,atomic(channel->pv->pgatomic)
300  ,doWait(false)
302  ,changed(new pvd::BitSet(channel->fielddesc->getNumberFields()))
303  ,pvf(pvd::getPVDataCreate()->createPVStructure(channel->fielddesc))
304 {
305  epics::atomic::increment(num_instances);
306  try {
307  getS<pvd::boolean>(pvReq, "record._options.atomic", atomic);
308 
309  getS<pvd::boolean>(pvReq, "record._options.block", doWait);
310 
311  std::string proccmd;
312  if(getS<std::string>(pvReq, "record._options.process", proccmd)) {
313  if(proccmd=="true") {
315  } else if(proccmd=="false") {
317  doWait = false; // no point in waiting
318  } else if(proccmd=="passive") {
320  } else {
321  requester->message("process= expects: true|false|passive", pva::warningMessage);
322  }
323  }
324  }catch(std::exception& e){
325  requester->message(std::string("Error processing request options: ")+e.what());
326  }
327 
328  pvf->getSubFieldT<pvd::PVBoolean>("record._options.atomic")->put(atomic);
329 
330 
331  const size_t npvs = channel->pv->members.size();
332  pvif.resize(npvs);
333  for(size_t i=0; i<npvs; i++)
334  {
335  PDBGroupPV::Info& info = channel->pv->members[i];
336 
337  pvif[i].reset(info.builder->attach(info.chan, pvf, info.attachment));
338  }
339 }
std::vector< std::tr1::shared_ptr< PVIF > > pvif
Definition: pdbgroup.h:177
epics::pvData::PVStructurePtr pvf
Definition: pdbgroup.h:176
bool doWait
Definition: pdbgroup.h:172
int i
Definition: scan.c:967
A vector of bits.
Definition: bitSet.h:56
static size_t num_instances
Definition: pdbgroup.h:179
PDBGroupChannel::shared_pointer channel
Definition: pdbgroup.h:168
epics::pvData::BitSetPtr changed
Definition: pdbgroup.h:175
requester_type::weak_pointer requester
Definition: pdbgroup.h:169
Class that holds the data for each possible scalar type.
Definition: pvData.h:54
FieldName attachment
Definition: pdbgroup.h:93
bool atomic
Definition: pdbgroup.h:172
std::tr1::shared_ptr< PVIFBuilder > builder
Definition: pdbgroup.h:92
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
virtual void put(epics::pvData::PVStructure::shared_pointer const &pvPutStructure, epics::pvData::BitSet::shared_pointer const &putBitSet) OVERRIDE FINAL
Definition: pdbgroup.cpp:346
PVIF::proc_t doProc
Definition: pdbgroup.h:173
PDBGroupPut::~PDBGroupPut ( )
virtual

Definition at line 341 of file pdbgroup.cpp.

342 {
343  epics::atomic::decrement(num_instances);
344 }
static size_t num_instances
Definition: pdbgroup.h:179

Member Function Documentation

virtual void PDBGroupPut::cancel ( )
inlinevirtual

Cancel any pending request. Completion will be reported via request's response callback:

  • if cancel() request is issued after the request was already complete, request success/failure completion will be reported and cancel() request ignored.
  • if the request was actually canceled, cancellation completion is reported.

Implements epics::pvAccess::ChannelRequest.

Definition at line 188 of file pdbgroup.h.

188 {}
virtual void PDBGroupPut::destroy ( )
inlinevirtual

Destroy this instance.

Implements epics::pvAccess::Destroyable.

Definition at line 186 of file pdbgroup.h.

186 { pvif.clear(); channel.reset(); requester.reset(); }
std::vector< std::tr1::shared_ptr< PVIF > > pvif
Definition: pdbgroup.h:177
PDBGroupChannel::shared_pointer channel
Definition: pdbgroup.h:168
requester_type::weak_pointer requester
Definition: pdbgroup.h:169
void PDBGroupPut::get ( )
virtual

Get the current data.

Ownership transfer as with ChannelGet::get()

Implements epics::pvAccess::ChannelPut.

Definition at line 390 of file pdbgroup.cpp.

391 {
392  const size_t npvs = pvif.size();
393 
394  changed->clear();
395  if(atomic) {
396  DBManyLocker L(channel->pv->locker);
397  for(size_t i=0; i<npvs; i++)
399  } else {
400 
401  for(size_t i=0; i<npvs; i++)
402  {
403  PDBGroupPV::Info& info = channel->pv->members[i];
404 
405  DBScanLocker L(dbChannelRecord(info.chan));
407  }
408  }
409  //TODO: report unused fields as changed?
410  changed->clear();
411  changed->set(0);
412 
413  requester_type::shared_pointer req(requester.lock());
414  if(req)
415  req->getDone(pvd::Status(), shared_from_this(), pvf, changed);
416 }
std::vector< std::tr1::shared_ptr< PVIF > > pvif
Definition: pdbgroup.h:177
epics::pvData::PVStructurePtr pvf
Definition: pdbgroup.h:176
int i
Definition: scan.c:967
#define NULL
Definition: catime.c:38
#define DBE_ALARM
Definition: caeventmask.h:41
#define DBE_VALUE
Definition: caeventmask.h:38
PDBGroupChannel::shared_pointer channel
Definition: pdbgroup.h:168
epics::pvData::BitSetPtr changed
Definition: pdbgroup.h:175
requester_type::weak_pointer requester
Definition: pdbgroup.h:169
#define DBE_PROPERTY
Definition: caeventmask.h:42
bool atomic
Definition: pdbgroup.h:172
virtual void put(epics::pvData::PVStructure::shared_pointer const &pvPutStructure, epics::pvData::BitSet::shared_pointer const &putBitSet) OVERRIDE FINAL
Definition: pdbgroup.cpp:346
virtual std::tr1::shared_ptr<epics::pvAccess::Channel> PDBGroupPut::getChannel ( )
inlinevirtual

Get a channel instance this request belongs to.

Returns
the channel instance.

Implements epics::pvAccess::ChannelRequest.

Definition at line 187 of file pdbgroup.h.

187 { return channel; }
PDBGroupChannel::shared_pointer channel
Definition: pdbgroup.h:168
virtual void PDBGroupPut::lastRequest ( )
inlinevirtual

Announce next request as last request. When last request will be completed (regardless of completion status) the remote and local instance will be destroyed.

Implements epics::pvAccess::ChannelRequest.

Definition at line 189 of file pdbgroup.h.

189 {}
PDBGroupPut::POINTER_DEFINITIONS ( PDBGroupPut  )
void PDBGroupPut::put ( epics::pvData::PVStructure::shared_pointer const &  pvPutStructure,
epics::pvData::BitSet::shared_pointer const &  putBitSet 
)
virtual

Put data to a channel.

Completion status is reported by calling ChannelPutRequester::putDone()

Ownership of the PVStructure is transfered to the ChannelPut until ChannelPutRequester::putDone() or ChannelPutRequester::channelDisconnect() is called.

Parameters
pvPutStructureThe PVStructure that holds the putData.
putBitSetputPVStructure bit-set (selects what fields to put).

Implements epics::pvAccess::ChannelPut.

Definition at line 346 of file pdbgroup.cpp.

348 {
349  // assume value may be a different struct each time... lot of wasted prep work
350  const size_t npvs = channel->pv->members.size();
351  std::vector<std::tr1::shared_ptr<PVIF> > putpvif(npvs);
352 
353  for(size_t i=0; i<npvs; i++)
354  {
355  PDBGroupPV::Info& info = channel->pv->members[i];
356  if(!info.allowProc) continue;
357 
358  putpvif[i].reset(info.builder->attach(info.chan, value, info.attachment));
359  }
360 
361  pvd::Status ret;
362  if(atomic) {
363  DBManyLocker L(channel->pv->locker);
364  for(size_t i=0; ret && i<npvs; i++) {
365  if(!putpvif[i].get()) continue;
366 
367  ret |= putpvif[i]->get(*changed, doProc);
368  }
369 
370  } else {
371  for(size_t i=0; ret && i<npvs; i++)
372  {
373  if(!putpvif[i].get()) continue;
374 
375  PDBGroupPV::Info& info = channel->pv->members[i];
376 
377  DBScanLocker L(dbChannelRecord(info.chan));
378 
379  ret |= putpvif[i]->get(*changed,
381  channel->aspvt[i].canWrite());
382  }
383  }
384 
385  requester_type::shared_pointer req(requester.lock());
386  if(req)
387  req->putDone(ret, shared_from_this());
388 }
Definition: link.h:174
int i
Definition: scan.c:967
PDBGroupChannel::shared_pointer channel
Definition: pdbgroup.h:168
epics::pvData::BitSetPtr changed
Definition: pdbgroup.h:175
requester_type::weak_pointer requester
Definition: pdbgroup.h:169
FieldName attachment
Definition: pdbgroup.h:93
bool atomic
Definition: pdbgroup.h:172
std::tr1::shared_ptr< PVIFBuilder > builder
Definition: pdbgroup.h:92
PVIF::proc_t doProc
Definition: pdbgroup.h:173

Member Data Documentation

bool PDBGroupPut::atomic

Definition at line 172 of file pdbgroup.h.

epics::pvData::BitSetPtr PDBGroupPut::changed

Definition at line 175 of file pdbgroup.h.

PDBGroupChannel::shared_pointer PDBGroupPut::channel

Definition at line 168 of file pdbgroup.h.

PVIF::proc_t PDBGroupPut::doProc

Definition at line 173 of file pdbgroup.h.

bool PDBGroupPut::doWait

Definition at line 172 of file pdbgroup.h.

size_t PDBGroupPut::num_instances
static

Definition at line 179 of file pdbgroup.h.

Definition at line 176 of file pdbgroup.h.

std::vector<std::tr1::shared_ptr<PVIF> > PDBGroupPut::pvif

Definition at line 177 of file pdbgroup.h.

requester_type::weak_pointer PDBGroupPut::requester

Definition at line 169 of file pdbgroup.h.


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