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

#include "responseHandlers.h"

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

Public Types

typedef std::tr1::shared_ptr< ServerChannelRPCRequesterImplshared_pointer
 
typedef std::tr1::shared_ptr< const ServerChannelRPCRequesterImplconst_shared_pointer
 
- Public Types inherited from epics::pvAccess::ChannelRPCRequester
typedef ChannelRPC operation_type
 

Public Member Functions

virtual ~ServerChannelRPCRequesterImpl ()
 
virtual void channelRPCConnect (const epics::pvData::Status &status, ChannelRPC::shared_pointer const &channelRPC) OVERRIDE FINAL
 
virtual void requestDone (const epics::pvData::Status &status, ChannelRPC::shared_pointer const &channelRPC, epics::pvData::PVStructure::shared_pointer const &pvResponse) OVERRIDE FINAL
 
virtual void destroy () OVERRIDE FINAL
 
ChannelRPC::shared_pointer getChannelRPC ()
 
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::ChannelRPCRequester
 POINTER_DEFINITIONS (ChannelRPCRequester)
 
virtual ~ChannelRPCRequester ()
 
- Public Member Functions inherited from epics::pvAccess::ChannelBaseRequester
 POINTER_DEFINITIONS (ChannelBaseRequester)
 
 ChannelBaseRequester ()
 
virtual ~ChannelBaseRequester ()
 
virtual void channelDisconnect (bool destroy)
 

Static Public Member Functions

static ChannelRPCRequester::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

 ServerChannelRPCRequesterImpl (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 759 of file responseHandlers.h.

Member Typedef Documentation

Constructor & Destructor Documentation

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

Definition at line 2786 of file responseHandlers.cpp.

2788  :
2789  BaseChannelRequester(context, channel, ioid, transport),
2790  _channelRPC(), _pvResponse()
2791  ,_status(Status::fatal("Invalid State"))
2792 
2793 {
2794 }
BaseChannelRequester(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
static Status fatal(const std::string &m)
Definition: status.h:51
virtual epics::pvAccess::ServerChannelRPCRequesterImpl::~ServerChannelRPCRequesterImpl ( )
inlinevirtual

Definition at line 776 of file responseHandlers.h.

776 {}

Member Function Documentation

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

Definition at line 2806 of file responseHandlers.cpp.

2807 {
2809  shared_pointer thisPointer(shared_from_this());
2810  _channel->registerRequest(_ioid, thisPointer);
2811  INIT_EXCEPTION_GUARD(CMD_RPC, _channelRPC, _channel->getChannel()->createChannelRPC(thisPointer, pvRequest));
2812 }
std::tr1::shared_ptr< ServerChannelRPCRequesterImpl > 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::ServerChannelRPCRequesterImpl::channelRPCConnect ( const epics::pvData::Status status,
ChannelRPC::shared_pointer const &  operation 
)
virtual

RPC creation request satisfied.

Must check status.isOk().

On Success, a non-NULL 'operation' is provided. This is the same pointer which was, or will be, returned from Channel::createChannelRPC().

It is allowed to call ChannelRPC::request() from within this method.

Implements epics::pvAccess::ChannelRPCRequester.

Definition at line 2814 of file responseHandlers.cpp.

2815 {
2816  {
2817  Lock guard(_mutex);
2818  _status = status;
2819  _channelRPC = channelRPC;
2820  }
2821  TransportSender::shared_pointer thisSender = shared_from_this();
2822  _transport->enqueueSendRequest(thisSender);
2823 
2824  // self-destruction
2825  if (!status.isSuccess())
2826  {
2827  destroy();
2828  }
2829 }
pvd::Status status
A lock for multithreading.
Definition: lock.h:36
const Transport::shared_pointer _transport
bool isSuccess() const
Definition: status.h:103
ChannelRPCRequester::shared_pointer epics::pvAccess::ServerChannelRPCRequesterImpl::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 2796 of file responseHandlers.cpp.

2799 {
2800  // TODO use std::make_shared
2801  std::tr1::shared_ptr<ServerChannelRPCRequesterImpl> tp(new ServerChannelRPCRequesterImpl(context, channel, ioid, transport));
2802  tp->activate(pvRequest);
2803  return tp;
2804 }
ServerChannelRPCRequesterImpl(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
void epics::pvAccess::ServerChannelRPCRequesterImpl::destroy ( )
virtual

Destroy this instance.

Implements epics::pvAccess::Destroyable.

Definition at line 2842 of file responseHandlers.cpp.

2843 {
2844  // keep a reference to ourselves as the owner
2845  // could release its reference and we don't want to be
2846  // destroyed prematurely
2847  shared_pointer self(shared_from_this());
2848 
2849  {
2850  Lock guard(_mutex);
2851  _channel->unregisterRequest(_ioid);
2852 
2853  if (_channelRPC.get())
2854  {
2855  _channelRPC->destroy();
2856  }
2857  }
2858  // TODO
2859  _channelRPC.reset();
2860 }
std::tr1::shared_ptr< ServerChannelRPCRequesterImpl > shared_pointer
const std::tr1::shared_ptr< ServerChannel > _channel
A lock for multithreading.
Definition: lock.h:36
ChannelRPC::shared_pointer epics::pvAccess::ServerChannelRPCRequesterImpl::getChannelRPC ( )
Returns
the channelRPC

Definition at line 2862 of file responseHandlers.cpp.

2863 {
2864  //Lock guard(_mutex);
2865  return _channelRPC;
2866 }
virtual std::tr1::shared_ptr<ChannelRequest> epics::pvAccess::ServerChannelRPCRequesterImpl::getOperation ( )
inlinevirtual

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

Implements epics::pvAccess::BaseChannelRequester.

Definition at line 787 of file responseHandlers.h.

787 { return getChannelRPC(); }
void epics::pvAccess::ServerChannelRPCRequesterImpl::requestDone ( const epics::pvData::Status status,
ChannelRPC::shared_pointer const &  operation,
epics::pvData::PVStructure::shared_pointer const &  pvResponse 
)
virtual

RPC request (execution) completed.

Must check status.isOk().

On Success, a non-NULL 'pvResponse' is provided.

It is allowed to call ChannelRPC::request() from within this method.

Implements epics::pvAccess::ChannelRPCRequester.

Definition at line 2831 of file responseHandlers.cpp.

2832 {
2833  {
2834  Lock guard(_mutex);
2835  _status = status;
2836  _pvResponse = pvResponse;
2837  }
2838  TransportSender::shared_pointer thisSender = shared_from_this();
2839  _transport->enqueueSendRequest(thisSender);
2840 }
pvd::Status status
A lock for multithreading.
Definition: lock.h:36
const Transport::shared_pointer _transport
void epics::pvAccess::ServerChannelRPCRequesterImpl::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 2868 of file responseHandlers.cpp.

2869 {
2870  const int32 request = getPendingRequest();
2871 
2872  control->startMessage((int32)CMD_RPC, sizeof(int32)/sizeof(int8) + 1);
2873  buffer->putInt(_ioid);
2874  buffer->putByte((int8)request);
2875 
2876  {
2877  Lock guard(_mutex);
2878  _status.serialize(buffer, control);
2879 
2880  if (_status.isSuccess())
2881  {
2882  if ((QOS_INIT & request) != 0)
2883  {
2884  // noop
2885  }
2886  else
2887  {
2888  SerializationHelper::serializeStructureFull(buffer, control, _pvResponse);
2889  }
2890  }
2891  _status = Status::fatal("Stale state");
2892  }
2893 
2894  stopRequest();
2895 
2896  // lastRequest
2897  if ((QOS_DESTROY & request) != 0)
2898  destroy();
2899 }
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
static Status fatal(const std::string &m)
Definition: status.h:51
bool isSuccess() const
Definition: status.h:103
EPICS_ALWAYS_INLINE void putByte(int8 value)
Definition: byteBuffer.h:525
static void serializeStructureFull(epics::pvData::ByteBuffer *buffer, epics::pvData::SerializableControl *control, epics::pvData::PVStructure::shared_pointer const &pvStructure)
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: