This is Unofficial EPICS BASE Doxygen Site
epics::pvAccess::IntrospectionRegistry Class Reference

#include "introspectionRegistry.h"

Public Member Functions

 IntrospectionRegistry ()
 
virtual ~IntrospectionRegistry ()
 
void reset ()
 
void serialize (epics::pvData::FieldConstPtr const &field, epics::pvData::ByteBuffer *buffer, epics::pvData::SerializableControl *control)
 
epics::pvData::FieldConstPtr deserialize (epics::pvData::ByteBuffer *buffer, epics::pvData::DeserializableControl *control)
 

Static Public Attributes

static const epics::pvData::int8 NULL_TYPE_CODE = (int8)-1
 
static const epics::pvData::int8 ONLY_ID_TYPE_CODE = (int8)-2
 
static const epics::pvData::int8 FULL_WITH_ID_TYPE_CODE = (int8)-3
 

Detailed Description

PVData Structure registry. Registry is used to cache introspection interfaces to minimize network traffic.

Author
gjansa

Definition at line 45 of file introspectionRegistry.h.

Constructor & Destructor Documentation

epics::pvAccess::IntrospectionRegistry::IntrospectionRegistry ( )

Definition at line 23 of file introspectionRegistry.cpp.

epics::pvAccess::IntrospectionRegistry::~IntrospectionRegistry ( )
virtual

Definition at line 28 of file introspectionRegistry.cpp.

Member Function Documentation

FieldConstPtr epics::pvAccess::IntrospectionRegistry::deserialize ( epics::pvData::ByteBuffer buffer,
epics::pvData::DeserializableControl control 
)

Deserializes introspection interface

TODO

Parameters
buffer
control
Returns
Field deserialized from the buffer.

Definition at line 103 of file introspectionRegistry.cpp.

104 {
105  control->ensureData(1);
106  size_t pos = buffer->getPosition();
107  const int8 typeCode = buffer->getByte();
108 
109  if (typeCode == NULL_TYPE_CODE)
110  {
111  return FieldConstPtr();
112  }
113  else if (typeCode == ONLY_ID_TYPE_CODE)
114  {
115  control->ensureData(sizeof(int16));
116  int16 id = buffer->getShort();
117 
118  registryMap_t::iterator registryIter = _registry.find(id);
119  if(registryIter == _registry.end())
120  {
121  // peer gave us an id which we don't remember.
122  // This isn't recoverable.
123  throw std::runtime_error("IntrospectionRegistry miss.");
124  }
125  return registryIter->second;
126  }
127  // could also be a mask
129  {
130  control->ensureData(sizeof(int16)/sizeof(int8));
131  const short key = buffer->getShort();
132  FieldConstPtr field = _fieldCreate->deserialize(buffer, control);
133  _registry[key] = field;
134  return field;
135  }
136 
137  // return typeCode back
138  buffer->setPosition(pos);
139  return _fieldCreate->deserialize(buffer, control);
140 }
int8_t int8
Definition: pvType.h:75
EPICS_ALWAYS_INLINE int8 getByte()
Definition: byteBuffer.h:617
std::size_t getPosition() const
Definition: byteBuffer.h:346
void setPosition(std::size_t pos)
Definition: byteBuffer.h:357
EPICS_ALWAYS_INLINE int16 getShort()
Definition: byteBuffer.h:623
std::tr1::shared_ptr< const Field > FieldConstPtr
Definition: pvIntrospect.h:137
static const epics::pvData::int8 ONLY_ID_TYPE_CODE
int16_t int16
Definition: pvType.h:79
virtual void ensureData(std::size_t size)=0
static const epics::pvData::int8 NULL_TYPE_CODE
static const epics::pvData::int8 FULL_WITH_ID_TYPE_CODE
void epics::pvAccess::IntrospectionRegistry::reset ( )

Resets registry, i.e. must be done when transport is changed (server restarted).

Definition at line 33 of file introspectionRegistry.cpp.

34 {
35  _pointer = 1;
36  _registry.clear();
37 }
void epics::pvAccess::IntrospectionRegistry::serialize ( epics::pvData::FieldConstPtr const &  field,
epics::pvData::ByteBuffer buffer,
epics::pvData::SerializableControl control 
)

Serializes introspection interface

Parameters
field
buffer
control

Definition at line 70 of file introspectionRegistry.cpp.

71 {
72  if (field.get() == NULL)
73  {
75  }
76  else
77  {
78  // do not cache scalars, scalarArrays
79  // ... and (array of) variant unions - not worth the complex condition,
80  // unless bool Field.cache() would exist
81  if (field->getType() != scalar &&
82  field->getType() != scalarArray)
83  {
84  bool existing;
85  const int16 key = registerIntrospectionInterface(field, existing);
86  if (existing) {
87  control->ensureBuffer(3);
88  buffer->putByte(ONLY_ID_TYPE_CODE);
89  buffer->putShort(key);
90  return;
91  }
92  else {
93  control->ensureBuffer(3);
94  buffer->putByte(FULL_WITH_ID_TYPE_CODE); // could also be a mask
95  buffer->putShort(key);
96  }
97  }
98 
99  field->serialize(buffer, control);
100  }
101 }
static void serializeNullField(epics::pvData::ByteBuffer *buffer, epics::pvData::SerializableControl *control)
#define NULL
Definition: catime.c:38
EPICS_ALWAYS_INLINE void putByte(int8 value)
Definition: byteBuffer.h:525
static const epics::pvData::int8 ONLY_ID_TYPE_CODE
virtual void ensureBuffer(std::size_t size)=0
int16_t int16
Definition: pvType.h:79
EPICS_ALWAYS_INLINE void putShort(int16 value)
Definition: byteBuffer.h:531
static const epics::pvData::int8 FULL_WITH_ID_TYPE_CODE

Member Data Documentation

const int8 epics::pvAccess::IntrospectionRegistry::FULL_WITH_ID_TYPE_CODE = (int8)-3
static

Serialization contains an ID (that can be used later, if cached) and full interface description.

Definition at line 103 of file introspectionRegistry.h.

const int8 epics::pvAccess::IntrospectionRegistry::NULL_TYPE_CODE = (int8)-1
static

Null type.

Definition at line 93 of file introspectionRegistry.h.

const int8 epics::pvAccess::IntrospectionRegistry::ONLY_ID_TYPE_CODE = (int8)-2
static

Serialization contains only an ID (that was assigned by one of the previous FULL_WITH_ID descriptions).

Definition at line 98 of file introspectionRegistry.h.


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