This is Unofficial EPICS BASE Doxygen Site
baseChannelRequester.cpp
Go to the documentation of this file.
1 
7 #include <epicsAtomic.h>
8 
9 #define epicsExportSharedSymbols
11 
12 using namespace epics::pvData;
13 using std::string;
14 
15 namespace epics {
16 namespace pvAccess {
17 
18 const Status BaseChannelRequester::okStatus = Status();
19 const Status BaseChannelRequester::badCIDStatus(Status::STATUSTYPE_ERROR, "bad channel id");
20 const Status BaseChannelRequester::badIOIDStatus(Status::STATUSTYPE_ERROR, "bad request id");
21 const Status BaseChannelRequester::noReadACLStatus(Status::STATUSTYPE_ERROR, "no read access");
22 const Status BaseChannelRequester::noWriteACLStatus(Status::STATUSTYPE_ERROR, "no write access");
23 const Status BaseChannelRequester::noProcessACLStatus(Status::STATUSTYPE_ERROR, "no process access");
24 const Status BaseChannelRequester::otherRequestPendingStatus(Status::STATUSTYPE_ERROR, "other request pending");
25 const Status BaseChannelRequester::notAChannelRequestStatus(Status::STATUSTYPE_ERROR, "not a channel request");
26 
27 const int32 BaseChannelRequester::NULL_REQUEST = -1;
28 
29 BaseChannelRequester::BaseChannelRequester(
30  ServerContextImpl::shared_pointer const & context,
31  ServerChannel::shared_pointer const & channel,
32  const pvAccessID ioid,
33  Transport::shared_pointer const & transport) :
34  _ioid(ioid),
35  _transport(transport),
36  _channel(channel),
37  _context(context),
38  _pendingRequest(BaseChannelRequester::NULL_REQUEST)
39 {
40 
41 }
42 
44 {
45  Lock guard(_mutex);
46  if (_pendingRequest != NULL_REQUEST)
47  {
48  return false;
49  }
50  _pendingRequest = qos;
51  return true;
52 }
53 
55 {
56  Lock guard(_mutex);
57  _pendingRequest = NULL_REQUEST;
58 }
59 
61 {
62  Lock guard(_mutex);
63  return _pendingRequest;
64 }
65 
67 {
68  std::stringstream name;
69  name << typeid(*_transport).name() << "/" << _ioid;
70  return name.str();
71 }
72 
74 {
75  BaseChannelRequester::message(_transport, _ioid, message, messageType);
76 }
77 
78 void BaseChannelRequester::message(Transport::shared_pointer const & transport, const pvAccessID ioid, const string message, const MessageType messageType)
79 {
80  TransportSender::shared_pointer sender(new BaseChannelRequesterMessageTransportSender(ioid, message, messageType));
81  transport->enqueueSendRequest(sender);
82 }
83 
84 void BaseChannelRequester::sendFailureMessage(const int8 command, Transport::shared_pointer const & transport, const pvAccessID ioid, const int8 qos, const Status status)
85 {
86  TransportSender::shared_pointer sender(new BaseChannelRequesterFailureMessageTransportSender(command, transport, ioid, qos, status));
87  transport->enqueueSendRequest(sender);
88 }
89 
91 {
92  s.populated = true;
95  s.transportBytes.tx = atomic::get(_transport->_totalBytesSent);
96  s.transportBytes.rx = atomic::get(_transport->_totalBytesRecv);
97  s.transportPeer = _transport->getRemoteName();
98 }
99 
101  _ioid(ioid),
102  _message(message),
103  _messageType(messageType)
104 {
105 }
106 
108 {
109  control->startMessage((int8)CMD_MESSAGE, sizeof(int32)/sizeof(int8) + 1);
110  buffer->putInt(_ioid);
111  buffer->putByte((int8)_messageType);
112  epics::pvData::SerializeHelper::serializeString(_message, buffer, control);
113 }
114 
116  Transport::shared_pointer const & transport, const pvAccessID ioid, const int8 qos, const Status& status) :
117  _command(command),
118  _ioid(ioid),
119  _qos(qos),
120  _status(status),
121  _transport(transport)
122 {
123 }
124 
126 {
127  control->startMessage(_command, sizeof(int32)/sizeof(int8) + 1);
128  buffer->putInt(_ioid);
129  buffer->put(_qos);
130  _status.serialize(buffer, control);
131 }
132 
133 
134 }
135 }
int8_t int8
Definition: pvType.h:75
epicsInt32 pvAccessID
Definition: pvaDefs.h:18
pvd::Status status
EPICS_ALWAYS_INLINE void putInt(int32 value)
Definition: byteBuffer.h:537
bool startRequest(epics::pvData::int32 qos)
virtual void send(epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
A lock for multithreading.
Definition: lock.h:36
virtual void stats(Stats &s) const OVERRIDE FINAL
Query current counter values.
const Transport::shared_pointer _transport
pvData
Definition: monitor.h:428
void serialize(ByteBuffer *buffer, SerializableControl *flusher) const
Definition: status.cpp:45
BaseChannelRequesterFailureMessageTransportSender(const epics::pvData::int8 command, Transport::shared_pointer const &transport, const pvAccessID ioid, const epics::pvData::int8 qos, const epics::pvData::Status &status)
EPICS_ALWAYS_INLINE void putByte(int8 value)
Definition: byteBuffer.h:525
This class implements a Bytebuffer that is like the java.nio.ByteBuffer.
Definition: byteBuffer.h:233
static void serializeString(const std::string &value, ByteBuffer *buffer, SerializableControl *flusher)
virtual std::string getRequesterName() OVERRIDE FINAL
virtual void send(epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
virtual void message(std::string const &message, epics::pvData::MessageType messageType) OVERRIDE FINAL
Definition: caget.c:48
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)
virtual void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity, epics::pvData::int32 payloadSize=0)=0
BaseChannelRequesterMessageTransportSender(const pvAccessID _ioid, const std::string message, const epics::pvData::MessageType messageType)
int32_t int32
Definition: pvType.h:83
std::tr1::shared_ptr< ServerContextImpl > shared_pointer