This is Unofficial EPICS BASE Doxygen Site
epics::pvDatabase::ProcessRecord Class Reference

Process another record in the same database. More...

#include "processRecord.h"

+ Inheritance diagram for epics::pvDatabase::ProcessRecord:
+ Collaboration diagram for epics::pvDatabase::ProcessRecord:

Public Member Functions

 POINTER_DEFINITIONS (ProcessRecord)
 
virtual bool init ()
 
virtual void process ()
 Process the record specified by recordName. More...
 
virtual void run ()
 The run method for the thread. More...
 
void startThread ()
 Start the thread. More...
 
void stop ()
 Stop the thread. More...
 
- Public Member Functions inherited from epics::pvDatabase::PVRecord
 POINTER_DEFINITIONS (PVRecord)
 
virtual ~PVRecord ()
 
virtual void start ()
 Optional method for derived class. More...
 
virtual void destroy ()
 DEPRECATED. More...
 
virtual void remove ()
 remove record from database. More...
 
virtual epics::pvAccess::RPCServiceAsync::shared_pointer getService (epics::pvData::PVStructurePtr const &pvRequest)
 Optional method for derived class. More...
 
std::string getRecordName () const
 Get the name of the record. More...
 
PVRecordStructurePtr getPVRecordStructure () const
 Get the top level PVRecordStructure. More...
 
epics::pvData::PVStructurePtr getPVStructure () const
 Get the top level PVStructure. More...
 
PVRecordFieldPtr findPVRecordField (epics::pvData::PVFieldPtr const &pvField)
 Find the PVRecordField for the PVField. More...
 
void lock ()
 Lock the record. More...
 
void unlock ()
 Unlock the record. More...
 
bool tryLock ()
 Try to lock the record. More...
 
void lockOtherRecord (PVRecordPtr const &otherRecord)
 Lock another record. More...
 
bool addPVRecordClient (PVRecordClientPtr const &pvRecordClient)
 Add a client that wants to access the record. More...
 
bool addListener (PVListenerPtr const &pvListener, epics::pvCopy::PVCopyPtr const &pvCopy)
 Add a PVListener. More...
 
void nextMasterPVField (epics::pvData::PVFieldPtr const &pvField)
 PVCopyTraverseMasterCallback method. More...
 
bool removeListener (PVListenerPtr const &pvListener, epics::pvCopy::PVCopyPtr const &pvCopy)
 Remove a listener. More...
 
void beginGroupPut ()
 Begins a group of puts. More...
 
void endGroupPut ()
 Ends a group of puts. More...
 
int getTraceLevel ()
 get trace level (0,1,2) means (nothing,lifetime,process) More...
 
void setTraceLevel (int level)
 set trace level (0,1,2) means (nothing,lifetime,process) More...
 
- Public Member Functions inherited from epics::pvCopy::PVCopyTraverseMasterCallback
 POINTER_DEFINITIONS (PVCopyTraverseMasterCallback)
 
virtual ~PVCopyTraverseMasterCallback ()
 

Static Public Member Functions

static ProcessRecordPtr create (std::string const &recordName, double delay)
 
- Static Public Member Functions inherited from epics::pvDatabase::PVRecord
static PVRecordPtr create (std::string const &recordName, epics::pvData::PVStructurePtr const &pvStructure)
 Creates a soft record. More...
 

Additional Inherited Members

- Protected Member Functions inherited from epics::pvDatabase::PVRecord
 PVRecord (std::string const &recordName, epics::pvData::PVStructurePtr const &pvStructure)
 Constructor. More...
 
void initPVRecord ()
 Initializes the base class. More...
 

Detailed Description

Process another record in the same database.

A record to process another record It is meant to be used via a channelPutGet request. The argument has one field: recordName. The result has a field named status.

Definition at line 36 of file processRecord.h.

Member Function Documentation

ProcessRecordPtr epics::pvDatabase::ProcessRecord::create ( std::string const &  recordName,
double  delay 
)
static

Factory methods to create ProcessRecord.

Parameters
recordNameThe name for the ProcessRecord.
delayDelay time to wait between process requests.
Returns
A shared pointer to ProcessRecord.

Definition at line 43 of file processRecord.cpp.

45 {
46  FieldCreatePtr fieldCreate = getFieldCreate();
47  PVDataCreatePtr pvDataCreate = getPVDataCreate();
48  StructureConstPtr topStructure = fieldCreate->createFieldBuilder()->
49  addNestedStructure("argument")->
50  add("command",pvString)->
51  add("recordName",pvString)->
52  endNested()->
53  addNestedStructure("result") ->
54  add("status",pvString) ->
55  endNested()->
56  createStructure();
57  PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure);
58  ProcessRecordPtr pvRecord(
59  new ProcessRecord(recordName,pvStructure,delay));
60  if(!pvRecord->init()) pvRecord.reset();
61  return pvRecord;
62 }
std::tr1::shared_ptr< const Structure > StructureConstPtr
Definition: pvIntrospect.h:162
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
Definition: pvData.h:124
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::tr1::shared_ptr< FieldCreate > FieldCreatePtr
std::tr1::shared_ptr< ProcessRecord > ProcessRecordPtr
Definition: processRecord.h:25
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
bool epics::pvDatabase::ProcessRecord::init ( )
virtual

standard init method required by PVRecord

Returns
true unless record name already exists.

Reimplemented from epics::pvDatabase::PVRecord.

Definition at line 90 of file processRecord.cpp.

91 {
92  initPVRecord();
93  PVStructurePtr pvStructure = getPVStructure();
94  pvCommand = pvStructure->getSubField<PVString>("argument.command");
95  pvRecordName = pvStructure->getSubField<PVString>("argument.recordName");
96  if(!pvRecordName) return false;
97  pvResult = pvStructure->getSubField<PVString>("result.status");
98  if(!pvResult) return false;
99  startThread();
100  return true;
101 }
epics::pvData::PVStructurePtr getPVStructure() const
Get the top level PVStructure.
Definition: pvDatabase.h:141
PVString is special case, since it implements SerializableArray.
Definition: pvData.h:521
void startThread()
Start the thread.
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
void initPVRecord()
Initializes the base class.
Definition: pvRecord.cpp:110
epics::pvDatabase::ProcessRecord::POINTER_DEFINITIONS ( ProcessRecord  )
void epics::pvDatabase::ProcessRecord::process ( )
virtual

Process the record specified by recordName.

Reimplemented from epics::pvDatabase::PVRecord.

Definition at line 103 of file processRecord.cpp.

104 {
105  string recordName = pvRecordName->get();
106  string command = pvCommand->get();
107  if(command.compare("add")==0) {
109  std::map<std::string,PVRecordPtr>::iterator iter = pvRecordMap.find(recordName);
110  if(iter!=pvRecordMap.end()) {
111  pvResult->put(recordName + " already present");
112  return;
113  }
114  PVRecordPtr pvRecord = pvDatabase->findRecord(recordName);
115  if(!pvRecord) {
116  pvResult->put(recordName + " not in pvDatabase");
117  return;
118  }
119  pvRecordMap.insert(PVRecordMap::value_type(recordName,pvRecord));
120  pvResult->put("success");
121  return;
122  } else if(command.compare("remove")==0) {
124  std::map<std::string,PVRecordPtr>::iterator iter = pvRecordMap.find(recordName);
125  if(iter==pvRecordMap.end()) {
126  pvResult->put(recordName + " not found");
127  return;
128  }
129  pvRecordMap.erase(iter);
130  pvResult->put("success");
131  return;
132  } else {
133  pvResult->put(command + " not a valid command: only add and remove are valid");
134  return;
135  }
136 }
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
void epics::pvDatabase::ProcessRecord::run ( )
virtual

The run method for the thread.

Definition at line 138 of file processRecord.cpp.

139 {
140  while(true) {
141  if(runStop.tryWait()) {
142  runReturn.signal();
143  return;
144  }
145  if(delay>0.0) epicsThreadSleep(delay);
147  PVRecordMap::iterator iter;
148  for(iter = pvRecordMap.begin(); iter!=pvRecordMap.end(); ++iter) {
149  PVRecordPtr pvRecord = (*iter).second;
150  pvRecord->lock();
151  pvRecord->beginGroupPut();
152  try {
153  pvRecord->process();
154  } catch (std::exception& ex) {
155  std::cout << "record " << pvRecord->getRecordName() << "exception " << ex.what() << "\n";
156  } catch (...) {
157  std::cout<< "record " << pvRecord->getRecordName() << " process exception\n";
158  }
159  pvRecord->endGroupPut();
160  pvRecord->unlock();
161  }
162  }
163 }
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
LIBCOM_API void epicsStdCall epicsThreadSleep(double seconds)
Block the calling thread for at least the specified time.
Definition: osdThread.c:790
void epics::pvDatabase::ProcessRecord::startThread ( )

Start the thread.

Definition at line 64 of file processRecord.cpp.

65 {
66  thread = EpicsThreadPtr(new epicsThread(
67  *this,
68  "processRecord",
71  thread->start();
72 }
LIBCOM_API unsigned int epicsStdCall epicsThreadGetStackSize(epicsThreadStackSizeClass size)
Definition: osdThread.c:466
#define epicsThreadPriorityLow
Definition: epicsThread.h:75
std::tr1::shared_ptr< epicsThread > EpicsThreadPtr
Definition: processRecord.h:23
void epics::pvDatabase::ProcessRecord::stop ( )

Stop the thread.

Definition at line 74 of file processRecord.cpp.

75 {
76  runStop.signal();
77  runReturn.wait();
78 }

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