This is Unofficial EPICS BASE Doxygen Site
epics::pvDatabase::MonitorLocal Class Reference
+ Inheritance diagram for epics::pvDatabase::MonitorLocal:
+ Collaboration diagram for epics::pvDatabase::MonitorLocal:

Public Member Functions

 POINTER_DEFINITIONS (MonitorLocal)
 
virtual ~MonitorLocal ()
 
virtual void destroy ()
 
virtual Status start ()
 
virtual Status stop ()
 
virtual MonitorElementPtr poll ()
 
virtual void detach (PVRecordPtr const &pvRecord)
 Detach from the record because it is being removed. More...
 
virtual void release (MonitorElementPtr const &monitorElement)
 
virtual void dataPut (PVRecordFieldPtr const &pvRecordField)
 pvField has been modified. More...
 
virtual void dataPut (PVRecordStructurePtr const &requested, PVRecordFieldPtr const &pvRecordField)
 A subfield has been modified. More...
 
virtual void beginGroupPut (PVRecordPtr const &pvRecord)
 Begin a set of puts. More...
 
virtual void endGroupPut (PVRecordPtr const &pvRecord)
 End a set of puts. More...
 
virtual void unlisten (PVRecordPtr const &pvRecord)
 Connection to record is being terminated. More...
 
MonitorElementPtr getActiveElement ()
 
void releaseActiveElement ()
 
bool init (PVStructurePtr const &pvRequest)
 
 MonitorLocal (MonitorRequester::shared_pointer const &channelMonitorRequester, PVRecordPtr const &pvRecord)
 
PVCopyPtr getPVCopy ()
 
- Public Member Functions inherited from epics::pvAccess::Monitor
 POINTER_DEFINITIONS (Monitor)
 
virtual ~Monitor ()
 
virtual void getStats (Stats &s) const
 
virtual void reportRemoteQueueStatus (epics::pvData::int32 freeElements)
 
- Public Member Functions inherited from epics::pvAccess::Destroyable
 POINTER_DEFINITIONS (Destroyable)
 
- Public Member Functions inherited from epics::pvDatabase::PVListener
 POINTER_DEFINITIONS (PVListener)
 
virtual ~PVListener ()
 Destructor. More...
 
- Public Member Functions inherited from epics::pvDatabase::PVRecordClient
 POINTER_DEFINITIONS (PVRecordClient)
 
virtual ~PVRecordClient ()
 Destructor. More...
 

Additional Inherited Members

- Public Types inherited from epics::pvAccess::Monitor
typedef MonitorRequester requester_type
 
- Protected Member Functions inherited from epics::pvAccess::Destroyable
virtual ~Destroyable ()
 

Detailed Description

Definition at line 135 of file monitorFactory.cpp.

Constructor & Destructor Documentation

epics::pvDatabase::MonitorLocal::~MonitorLocal ( )
virtual

Definition at line 192 of file monitorFactory.cpp.

193 {
194 //cout << "MonitorLocal::~MonitorLocal()" << endl;
195 }
epics::pvDatabase::MonitorLocal::MonitorLocal ( MonitorRequester::shared_pointer const &  channelMonitorRequester,
PVRecordPtr const &  pvRecord 
)

Definition at line 181 of file monitorFactory.cpp.

184 : monitorRequester(channelMonitorRequester),
185  pvRecord(pvRecord),
186  state(idle),
187  isGroupPut(false),
188  dataChanged(false)
189 {
190 }

Member Function Documentation

void epics::pvDatabase::MonitorLocal::beginGroupPut ( PVRecordPtr const &  pvRecord)
virtual

Begin a set of puts.

Parameters
pvRecordThe record.

Implements epics::pvDatabase::PVListener.

Definition at line 342 of file monitorFactory.cpp.

343 {
344  if(pvRecord->getTraceLevel()>1)
345  {
346  cout << "MonitorLocal::beginGroupPut()" << endl;
347  }
348  if(state!=active) return;
349  {
350  Lock xx(mutex);
351  isGroupPut = true;
352  dataChanged = false;
353  }
354 }
A lock for multithreading.
Definition: lock.h:36
void epics::pvDatabase::MonitorLocal::dataPut ( PVRecordFieldPtr const &  pvRecordField)
virtual

pvField has been modified.

This is called if the listener has called PVRecordField::addListener for pvRecordField.

Parameters
pvRecordFieldThe modified field.

Implements epics::pvDatabase::PVListener.

Definition at line 290 of file monitorFactory.cpp.

291 {
292  if(pvRecord->getTraceLevel()>1)
293  {
294  cout << "MonitorLocal::dataPut(pvRecordField)" << endl;
295  }
296  if(state!=active) return;
297  {
298  Lock xx(mutex);
299  size_t offset = pvCopy->getCopyOffset(pvRecordField->getPVField());
300  BitSetPtr const &changedBitSet = activeElement->changedBitSet;
301  BitSetPtr const &overrunBitSet = activeElement->overrunBitSet;
302  bool isSet = changedBitSet->get(offset);
303  changedBitSet->set(offset);
304  if(isSet) overrunBitSet->set(offset);
305  dataChanged = true;
306  }
307  if(!isGroupPut) {
309  dataChanged = false;
310  }
311 }
A lock for multithreading.
Definition: lock.h:36
std::tr1::shared_ptr< BitSet > BitSetPtr
Definition: bitSet.h:26
void epics::pvDatabase::MonitorLocal::dataPut ( PVRecordStructurePtr const &  requested,
PVRecordFieldPtr const &  pvRecordField 
)
virtual

A subfield has been modified.

Parameters
requestedThe structure that was requested.
pvRecordFieldThe field that was modified.

Implements epics::pvDatabase::PVListener.

Definition at line 313 of file monitorFactory.cpp.

316 {
317  if(pvRecord->getTraceLevel()>1)
318  {
319  cout << "MonitorLocal::dataPut(requested,pvRecordField)" << endl;
320  }
321  if(state!=active) return;
322  {
323  Lock xx(mutex);
324  BitSetPtr const &changedBitSet = activeElement->changedBitSet;
325  BitSetPtr const &overrunBitSet = activeElement->overrunBitSet;
326  size_t offsetCopyRequested = pvCopy->getCopyOffset(
327  requested->getPVField());
328  size_t offset = offsetCopyRequested
329  + (pvRecordField->getPVField()->getFieldOffset()
330  - requested->getPVField()->getFieldOffset());
331  bool isSet = changedBitSet->get(offset);
332  changedBitSet->set(offset);
333  if(isSet) overrunBitSet->set(offset);
334  dataChanged = true;
335  }
336  if(!isGroupPut) {
338  dataChanged = false;
339  }
340 }
A lock for multithreading.
Definition: lock.h:36
std::tr1::shared_ptr< BitSet > BitSetPtr
Definition: bitSet.h:26
virtual void epics::pvDatabase::MonitorLocal::destroy ( )
inlinevirtual

Destroy this instance.

Implements epics::pvAccess::Destroyable.

Definition at line 144 of file monitorFactory.cpp.

144 {} // DEPRECATED
virtual void epics::pvDatabase::MonitorLocal::detach ( PVRecordPtr const &  pvRecord)
inlinevirtual

Detach from the record because it is being removed.

Parameters
pvRecordThe record.

Implements epics::pvDatabase::PVRecordClient.

Definition at line 148 of file monitorFactory.cpp.

148 {}
void epics::pvDatabase::MonitorLocal::endGroupPut ( PVRecordPtr const &  pvRecord)
virtual

End a set of puts.

Parameters
pvRecordThe record.

Implements epics::pvDatabase::PVListener.

Definition at line 356 of file monitorFactory.cpp.

357 {
358  if(pvRecord->getTraceLevel()>1)
359  {
360  cout << "MonitorLocal::endGroupPut dataChanged " << dataChanged << endl;
361  }
362  if(state!=active) return;
363  {
364  Lock xx(mutex);
365  isGroupPut = false;
366  }
367  if(dataChanged) {
368  dataChanged = false;
370  }
371 }
A lock for multithreading.
Definition: lock.h:36
MonitorElementPtr epics::pvDatabase::MonitorLocal::getActiveElement ( )
PVCopyPtr epics::pvDatabase::MonitorLocal::getPVCopy ( )
inline

Definition at line 163 of file monitorFactory.cpp.

163 { return pvCopy;}
bool epics::pvDatabase::MonitorLocal::init ( PVStructurePtr const &  pvRequest)

Definition at line 394 of file monitorFactory.cpp.

395 {
396  PVFieldPtr pvField;
397  size_t queueSize = 2;
398  PVStructurePtr pvOptions = pvRequest->getSubField<PVStructure>("record._options");
399  MonitorRequesterPtr requester = monitorRequester.lock();
400  if(!requester) return false;
401  if(pvOptions) {
402  PVStringPtr pvString = pvOptions->getSubField<PVString>("queueSize");
403  if(pvString) {
404  try {
405  int32 size;
406  std::stringstream ss;
407  ss << pvString->get();
408  ss >> size;
409  queueSize = size;
410  } catch (...) {
411  requester->message("queueSize " +pvString->get() + " illegal",errorMessage);
412  return false;
413  }
414  }
415  }
416  pvField = pvRequest->getSubField("field");
417  if(!pvField) {
418  pvCopy = PVCopy::create(
419  pvRecord->getPVRecordStructure()->getPVStructure(),
420  pvRequest,"");
421  if(!pvCopy) {
422  requester->message("illegal pvRequest",errorMessage);
423  return false;
424  }
425  } else {
426  if(pvField->getField()->getType()!=structure) {
427  requester->message("illegal pvRequest",errorMessage);
428  return false;
429  }
430  pvCopy = PVCopy::create(
431  pvRecord->getPVRecordStructure()->getPVStructure(),
432  pvRequest,"field");
433  if(!pvCopy) {
434  requester->message("illegal pvRequest",errorMessage);
435  return false;
436  }
437  }
438  if(queueSize<2) queueSize = 2;
439  std::vector<MonitorElementPtr> monitorElementArray;
440  monitorElementArray.reserve(queueSize);
441  for(size_t i=0; i<queueSize; i++) {
442  PVStructurePtr pvStructure = pvCopy->createPVStructure();
443  MonitorElementPtr monitorElement(
444  new MonitorElement(pvStructure));
445  monitorElementArray.push_back(monitorElement);
446  }
447  queue = MonitorElementQueuePtr(new MonitorElementQueue(monitorElementArray));
448  requester->monitorConnect(
449  Status::Ok,
450  getPtrSelf(),
451  pvCopy->getStructure());
452  return true;
453 }
int i
Definition: scan.c:967
An element for a monitorQueue.
Definition: monitor.h:54
storage_t::arg_type get() const
Definition: pvData.h:396
PVString is special case, since it implements SerializableArray.
Definition: pvData.h:521
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
Data interface for a structure,.
Definition: pvData.h:712
std::tr1::shared_ptr< MonitorRequester > MonitorRequesterPtr
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::tr1::shared_ptr< PVString > PVStringPtr
Definition: pvData.h:540
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
std::tr1::shared_ptr< MonitorElementQueue > MonitorElementQueuePtr
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
Definition: monitor.h:40
int32_t int32
Definition: pvType.h:83
epics::pvDatabase::MonitorLocal::POINTER_DEFINITIONS ( MonitorLocal  )
MonitorElementPtr epics::pvDatabase::MonitorLocal::poll ( )
virtual

If monitor has occurred return data.

Returns
monitorElement for modified data. Must call get to determine if data is available.

May recursively call MonitorRequester::unlisten()

Implements epics::pvAccess::Monitor.

Definition at line 238 of file monitorFactory.cpp.

239 {
240  if(pvRecord->getTraceLevel()>1)
241  {
242  cout << "MonitorLocal::poll state " << state << endl;
243  }
244  {
245  Lock xx(queueMutex);
246  if(state!=active) return NULLMonitorElement;
247  return queue->getUsed();
248  }
249 }
A lock for multithreading.
Definition: lock.h:36
void epics::pvDatabase::MonitorLocal::release ( MonitorElementPtr const &  monitorElement)
virtual

Release a MonitorElement that was returned by poll. A poll() must be called after the release() to check the presence of any modified data.

Parameters
monitorElement

Implements epics::pvAccess::Monitor.

Definition at line 251 of file monitorFactory.cpp.

252 {
253  if(pvRecord->getTraceLevel()>1)
254  {
255  cout << "MonitorLocal::release state " << state << endl;
256  }
257  {
258  Lock xx(queueMutex);
259  if(state!=active) return;
260  queue->releaseUsed(monitorElement);
261  }
262 }
A lock for multithreading.
Definition: lock.h:36
void epics::pvDatabase::MonitorLocal::releaseActiveElement ( )

Definition at line 264 of file monitorFactory.cpp.

265 {
266  if(pvRecord->getTraceLevel()>1)
267  {
268  cout << "MonitorLocal::releaseActiveElement state " << state << endl;
269  }
270  {
271  Lock xx(queueMutex);
272  if(state!=active) return;
273  bool result = pvCopy->updateCopyFromBitSet(activeElement->pvStructurePtr,activeElement->changedBitSet);
274  if(!result) return;
275  MonitorElementPtr newActive = queue->getFree();
276  if(!newActive) return;
277  BitSetUtil::compress(activeElement->changedBitSet,activeElement->pvStructurePtr);
278  BitSetUtil::compress(activeElement->overrunBitSet,activeElement->pvStructurePtr);
279  queue->setUsed(activeElement);
280  activeElement = newActive;
281  activeElement->changedBitSet->clear();
282  activeElement->overrunBitSet->clear();
283  }
284  MonitorRequesterPtr requester = monitorRequester.lock();
285  if(!requester) return;
286  requester->monitorEvent(getPtrSelf());
287  return;
288 }
pvac::PutEvent result
Definition: clientSync.cpp:117
A lock for multithreading.
Definition: lock.h:36
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
std::tr1::shared_ptr< MonitorRequester > MonitorRequesterPtr
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
Definition: monitor.h:40
Status epics::pvDatabase::MonitorLocal::start ( )
virtual

Start monitoring.

Returns
completion status.

Implements epics::pvAccess::Monitor.

Definition at line 198 of file monitorFactory.cpp.

199 {
200  if(pvRecord->getTraceLevel()>0)
201  {
202  cout << "MonitorLocal::start state " << state << endl;
203  }
204  {
205  Lock xx(mutex);
206  if(state==active) return alreadyStartedStatus;
207  if(state==deleted) return deletedStatus;
208  }
209  pvRecord->addListener(getPtrSelf(),pvCopy);
210  epicsGuard <PVRecord> guard(*pvRecord);
211  Lock xx(mutex);
212  state = active;
213  queue->clear();
214  isGroupPut = false;
215  activeElement = queue->getFree();
216  activeElement->changedBitSet->clear();
217  activeElement->overrunBitSet->clear();
218  activeElement->changedBitSet->set(0);
220  return Status::Ok;
221 }
A lock for multithreading.
Definition: lock.h:36
Status epics::pvDatabase::MonitorLocal::stop ( )
virtual

Stop Monitoring.

Returns
completion status.

Implements epics::pvAccess::Monitor.

Definition at line 223 of file monitorFactory.cpp.

224 {
225  if(pvRecord->getTraceLevel()>0){
226  cout << "MonitorLocal::stop state " << state << endl;
227  }
228  {
229  Lock xx(mutex);
230  if(state==idle) return notStartedStatus;
231  if(state==deleted) return deletedStatus;
232  state = idle;
233  }
234  pvRecord->removeListener(getPtrSelf(),pvCopy);
235  return Status::Ok;
236 }
A lock for multithreading.
Definition: lock.h:36
void epics::pvDatabase::MonitorLocal::unlisten ( PVRecordPtr const &  pvRecord)
virtual

Connection to record is being terminated.

Parameters
pvRecordThe record.

Implements epics::pvDatabase::PVListener.

Definition at line 373 of file monitorFactory.cpp.

374 {
375  if(pvRecord->getTraceLevel()>1)
376  {
377  cout << "MonitorLocal::unlisten\n";
378  }
379  {
380  Lock xx(mutex);
381  state = deleted;
382  }
383  MonitorRequesterPtr requester = monitorRequester.lock();
384  if(requester) {
385  if(pvRecord->getTraceLevel()>1)
386  {
387  cout << "MonitorLocal::unlisten calling requester->unlisten\n";
388  }
389  requester->unlisten(getPtrSelf());
390  }
391 }
A lock for multithreading.
Definition: lock.h:36
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
std::tr1::shared_ptr< MonitorRequester > MonitorRequesterPtr

The documentation for this class was generated from the following file: