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

#include "responseHandlers.h"

+ Inheritance diagram for epics::pvAccess::ServerChannelGetRequesterImpl:
+ Collaboration diagram for epics::pvAccess::ServerChannelGetRequesterImpl:

Public Types

typedef std::tr1::shared_ptr< ServerChannelGetRequesterImplshared_pointer
 
typedef std::tr1::shared_ptr< const ServerChannelGetRequesterImplconst_shared_pointer
 
- Public Types inherited from epics::pvAccess::ChannelGetRequester
typedef ChannelGet operation_type
 

Public Member Functions

virtual ~ServerChannelGetRequesterImpl ()
 
virtual void channelGetConnect (const epics::pvData::Status &status, ChannelGet::shared_pointer const &channelGet, epics::pvData::Structure::const_shared_pointer const &structure) OVERRIDE FINAL
 
virtual void getDone (const epics::pvData::Status &status, ChannelGet::shared_pointer const &channelGet, epics::pvData::PVStructure::shared_pointer const &pvStructure, epics::pvData::BitSet::shared_pointer const &bitSet) OVERRIDE FINAL
 
virtual void destroy () OVERRIDE FINAL
 
ChannelGet::shared_pointer getChannelGet ()
 
virtual std::tr1::shared_ptr< ChannelRequestgetOperation () OVERRIDE FINAL
 The Operation associated with this Requester, except for GetField and Monitor (which are special snowflakes...) More...
 
virtual void send (epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
 
- Public Member Functions inherited from epics::pvAccess::BaseChannelRequester
 POINTER_DEFINITIONS (BaseChannelRequester)
 
 BaseChannelRequester (ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
 
virtual ~BaseChannelRequester ()
 
bool startRequest (epics::pvData::int32 qos)
 
void stopRequest ()
 
epics::pvData::int32 getPendingRequest ()
 
virtual std::string getRequesterName () OVERRIDE FINAL
 
virtual void message (std::string const &message, epics::pvData::MessageType messageType) OVERRIDE FINAL
 
virtual void stats (Stats &s) const OVERRIDE FINAL
 Query current counter values. More...
 
- Public Member Functions inherited from epics::pvAccess::TransportSender
 POINTER_DEFINITIONS (TransportSender)
 
 TransportSender ()
 
virtual ~TransportSender ()
 
- Public Member Functions inherited from epics::pvAccess::Lockable
 POINTER_DEFINITIONS (Lockable)
 
virtual ~Lockable ()
 
virtual void lock ()
 
virtual void unlock ()
 
- Public Member Functions inherited from epics::pvAccess::fair_queue< T >::entry
 entry ()
 
 ~entry ()
 
- Public Member Functions inherited from epics::pvAccess::NetStats
virtual ~NetStats ()
 
- Public Member Functions inherited from epics::pvAccess::Destroyable
 POINTER_DEFINITIONS (Destroyable)
 
- Public Member Functions inherited from epics::pvAccess::ChannelGetRequester
 POINTER_DEFINITIONS (ChannelGetRequester)
 
virtual ~ChannelGetRequester ()
 
- Public Member Functions inherited from epics::pvAccess::ChannelBaseRequester
 POINTER_DEFINITIONS (ChannelBaseRequester)
 
 ChannelBaseRequester ()
 
virtual ~ChannelBaseRequester ()
 
virtual void channelDisconnect (bool destroy)
 

Static Public Member Functions

static ChannelGetRequester::shared_pointer create (ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport, epics::pvData::PVStructure::shared_pointer const &pvRequest)
 
- Static Public Member Functions inherited from epics::pvAccess::BaseChannelRequester
static void message (Transport::shared_pointer const &transport, const pvAccessID ioid, const std::string message, const epics::pvData::MessageType messageType)
 
static void sendFailureMessage (const epics::pvData::int8 command, Transport::shared_pointer const &transport, const pvAccessID ioid, const epics::pvData::int8 qos, const epics::pvData::Status status)
 

Protected Member Functions

 ServerChannelGetRequesterImpl (ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
 
void activate (epics::pvData::PVStructure::shared_pointer const &pvRequest)
 
- Protected Member Functions inherited from epics::pvAccess::Destroyable
virtual ~Destroyable ()
 

Additional Inherited Members

- Public Attributes inherited from epics::pvAccess::TransportSender
size_t bytesTX
 
size_t bytesRX
 
- Static Public Attributes inherited from epics::pvAccess::BaseChannelRequester
static const epics::pvData::Status okStatus = Status()
 
static const epics::pvData::Status badCIDStatus
 
static const epics::pvData::Status badIOIDStatus
 
static const epics::pvData::Status noReadACLStatus
 
static const epics::pvData::Status noWriteACLStatus
 
static const epics::pvData::Status noProcessACLStatus
 
static const epics::pvData::Status otherRequestPendingStatus
 
static const epics::pvData::Status notAChannelRequestStatus
 
- Static Public Attributes inherited from epics::pvAccess::ChannelBaseRequester
static size_t num_instances
 
- Protected Attributes inherited from epics::pvAccess::BaseChannelRequester
const pvAccessID _ioid
 
const Transport::shared_pointer _transport
 
const std::tr1::shared_ptr< ServerChannel_channel
 
epics::pvData::Mutex _mutex
 

Detailed Description

Definition at line 286 of file responseHandlers.h.

Member Typedef Documentation

Constructor & Destructor Documentation

epics::pvAccess::ServerChannelGetRequesterImpl::ServerChannelGetRequesterImpl ( ServerContextImpl::shared_pointer const &  context,
std::tr1::shared_ptr< ServerChannel > const &  channel,
const pvAccessID  ioid,
Transport::shared_pointer const &  transport 
)
protected

Definition at line 1099 of file responseHandlers.cpp.

1099  :
1100  BaseChannelRequester(context, channel, ioid, transport)
1101 
1102 {
1103 }
BaseChannelRequester(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
virtual epics::pvAccess::ServerChannelGetRequesterImpl::~ServerChannelGetRequesterImpl ( )
inlinevirtual

Definition at line 304 of file responseHandlers.h.

304 {}

Member Function Documentation

void epics::pvAccess::ServerChannelGetRequesterImpl::activate ( epics::pvData::PVStructure::shared_pointer const &  pvRequest)
protected

Definition at line 1115 of file responseHandlers.cpp.

1116 {
1118  shared_pointer thisPointer(shared_from_this());
1119  _channel->registerRequest(_ioid, thisPointer);
1120  INIT_EXCEPTION_GUARD(CMD_GET, _channelGet, _channel->getChannel()->createChannelGet(thisPointer, pvRequest));
1121 }
std::tr1::shared_ptr< ServerChannelGetRequesterImpl > shared_pointer
const std::tr1::shared_ptr< ServerChannel > _channel
#define INIT_EXCEPTION_GUARD(cmd, var, code)
bool startRequest(epics::pvData::int32 qos)
void epics::pvAccess::ServerChannelGetRequesterImpl::channelGetConnect ( const epics::pvData::Status status,
ChannelGet::shared_pointer const &  channelGet,
epics::pvData::Structure::const_shared_pointer const &  structure 
)
virtual

The client and server have both completed the createChannelGet request.

Parameters
statusCompletion status.
channelGetThe channelGet interface or nullptr if the request failed.
structureThe introspection interface of requested get structure or nullptr if the request failed.

Implements epics::pvAccess::ChannelGetRequester.

Definition at line 1123 of file responseHandlers.cpp.

1124 {
1125  {
1126  Lock guard(_mutex);
1127  _status = status;
1128  _channelGet = channelGet;
1129 
1130  if (_status.isSuccess())
1131  {
1132  _pvStructure = std::tr1::static_pointer_cast<PVStructure>(reuseOrCreatePVField(structure, _pvStructure));
1133  _bitSet = createBitSetFor(_pvStructure, _bitSet);
1134  }
1135  }
1136 
1137  TransportSender::shared_pointer thisSender = shared_from_this();
1138  _transport->enqueueSendRequest(thisSender);
1139 
1140  // self-destruction
1141  if (!status.isSuccess())
1142  {
1143  destroy();
1144  }
1145 }
pvd::Status status
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:788
A lock for multithreading.
Definition: lock.h:36
const Transport::shared_pointer _transport
bool isSuccess() const
Definition: status.h:103
Data interface for a structure,.
Definition: pvData.h:712
ChannelGetRequester::shared_pointer epics::pvAccess::ServerChannelGetRequesterImpl::create ( ServerContextImpl::shared_pointer const &  context,
std::tr1::shared_ptr< ServerChannel > const &  channel,
const pvAccessID  ioid,
Transport::shared_pointer const &  transport,
epics::pvData::PVStructure::shared_pointer const &  pvRequest 
)
static

Definition at line 1105 of file responseHandlers.cpp.

1107 {
1108  // TODO use std::make_shared
1109  std::tr1::shared_ptr<ServerChannelGetRequesterImpl> tp(new ServerChannelGetRequesterImpl(context, channel, ioid, transport));
1110  ChannelGetRequester::shared_pointer thisPointer = tp;
1111  static_cast<ServerChannelGetRequesterImpl*>(thisPointer.get())->activate(pvRequest);
1112  return thisPointer;
1113 }
void activate(epics::pvData::PVStructure::shared_pointer const &pvRequest)
ServerChannelGetRequesterImpl(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
void epics::pvAccess::ServerChannelGetRequesterImpl::destroy ( )
virtual

Destroy this instance.

Implements epics::pvAccess::Destroyable.

Definition at line 1164 of file responseHandlers.cpp.

1165 {
1166  // keep a reference to ourselves as the owner
1167  // could release its reference and we don't want to be
1168  // destroyed prematurely
1169  shared_pointer self(shared_from_this());
1170 
1171  // hold a reference to channelGet so that _channelGet.reset()
1172  // does not call ~ChannelGet (external code) while we are holding a lock
1173  ChannelGet::shared_pointer channelGet = _channelGet;
1174  {
1175  Lock guard(_mutex);
1176  _channel->unregisterRequest(_ioid);
1177 
1178  if (_channelGet)
1179  {
1180  _channelGet->destroy();
1181  _channelGet.reset();
1182  }
1183  }
1184 }
std::tr1::shared_ptr< ServerChannelGetRequesterImpl > shared_pointer
const std::tr1::shared_ptr< ServerChannel > _channel
A lock for multithreading.
Definition: lock.h:36
ChannelGet::shared_pointer epics::pvAccess::ServerChannelGetRequesterImpl::getChannelGet ( )

Definition at line 1186 of file responseHandlers.cpp.

1187 {
1188  return _channelGet;
1189 }
void epics::pvAccess::ServerChannelGetRequesterImpl::getDone ( const epics::pvData::Status status,
ChannelGet::shared_pointer const &  channelGet,
epics::pvData::PVStructure::shared_pointer const &  pvStructure,
epics::pvData::BitSet::shared_pointer const &  bitSet 
)
virtual

The request is done. This is always called with no locks held.

Ownership of the PVStructure is passed to the ChannelGetRequester until a subsequent call to ChannelGet::get() or ChannelGetRequester::channelDisconnect()

Parameters
statusCompletion status.
channelGetThe channelGet interface.
pvStructureThe PVStructure that holds the data or nullptr if the request failed.
bitSetThe bitSet for that shows what data has changed or nullptr if the request failed.

Implements epics::pvAccess::ChannelGetRequester.

Definition at line 1147 of file responseHandlers.cpp.

1149 {
1150  {
1151  Lock guard(_mutex);
1152  _status = status;
1153  if (_status.isSuccess())
1154  {
1155  *_bitSet = *bitSet;
1156  _pvStructure->copyUnchecked(*pvStructure, *_bitSet);
1157  }
1158  }
1159 
1160  TransportSender::shared_pointer thisSender = shared_from_this();
1161  _transport->enqueueSendRequest(thisSender);
1162 }
pvd::Status status
A lock for multithreading.
Definition: lock.h:36
const Transport::shared_pointer _transport
bool isSuccess() const
Definition: status.h:103
virtual std::tr1::shared_ptr<ChannelRequest> epics::pvAccess::ServerChannelGetRequesterImpl::getOperation ( )
inlinevirtual

The Operation associated with this Requester, except for GetField and Monitor (which are special snowflakes...)

Implements epics::pvAccess::BaseChannelRequester.

Definition at line 313 of file responseHandlers.h.

313 { return getChannelGet(); }
void epics::pvAccess::ServerChannelGetRequesterImpl::send ( epics::pvData::ByteBuffer buffer,
TransportSendControl control 
)
virtual

Called by transport. By this call transport gives callee ownership over the buffer. Calls on TransportSendControl instance must be made from calling thread. Moreover, ownership is valid only for the time of call of this method. NOTE: these limitations allow efficient implementation.

Implements epics::pvAccess::TransportSender.

Definition at line 1192 of file responseHandlers.cpp.

1193 {
1194  const int32 request = getPendingRequest();
1195 
1196  ChannelGet::shared_pointer channelGet;
1197  {
1198  Lock guard(_mutex);
1199  channelGet = _channelGet;
1200  // we must respond to QOS_INIT (e.g. creation error)
1201  if (!channelGet && !(request & QOS_INIT))
1202  return;
1203  }
1204 
1205  control->startMessage((int8)CMD_GET, sizeof(int32)/sizeof(int8) + 1);
1206  buffer->putInt(_ioid);
1207  buffer->put((int8)request);
1208  {
1209  Lock guard(_mutex);
1210  _status.serialize(buffer, control);
1211  }
1212 
1213  // TODO !!!
1214  // if we call stopRequest() below (the second one, commented out), we might be too late
1215  // since between last serialization data and stopRequest() a buffer can be already flushed
1216  // (i.e. in case of directSerialize)
1217  // if we call it here, then a bad client can issue another request just after stopRequest() was called
1218  stopRequest();
1219 
1220  if (_status.isSuccess())
1221  {
1222  if (request & QOS_INIT)
1223  {
1224  Lock guard(_mutex);
1225  control->cachedSerialize(_pvStructure->getStructure(), buffer);
1226  }
1227  else
1228  {
1229  ScopedLock lock(channelGet);
1230 
1231  _bitSet->serialize(buffer, control);
1232  _pvStructure->serialize(buffer, control, _bitSet.get());
1233  }
1234  }
1235 
1236  //stopRequest();
1237 
1238  // lastRequest
1239  if (request & QOS_DESTROY)
1240  {
1241  destroy();
1242  }
1243 }
int8_t int8
Definition: pvType.h:75
std::string request
EPICS_ALWAYS_INLINE void putInt(int32 value)
Definition: byteBuffer.h:537
A lock for multithreading.
Definition: lock.h:36
void serialize(ByteBuffer *buffer, SerializableControl *flusher) const
Definition: status.cpp:45
bool isSuccess() const
Definition: status.h:103
virtual void cachedSerialize(std::tr1::shared_ptr< const Field > const &field, ByteBuffer *buffer)=0
virtual void lock()
Definition: pvAccess.h:97
virtual void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity, epics::pvData::int32 payloadSize=0)=0
int32_t int32
Definition: pvType.h:83

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