This is Unofficial EPICS BASE Doxygen Site
comQueSend Class Reference

#include "comQueSend.h"

Public Member Functions

 comQueSend (wireSendAdapter &, comBufMemoryManager &)
 
 ~comQueSend ()
 
void clear ()
 
unsigned occupiedBytes () const
 
bool flushEarlyThreshold (unsigned nBytesThisMsg) const
 
bool flushBlockThreshold () const
 
void pushUInt16 (const ca_uint16_t value)
 
void pushUInt32 (const ca_uint32_t value)
 
void pushFloat32 (const ca_float32_t value)
 
void pushString (const char *pVal, unsigned nChar)
 
void insertRequestHeader (ca_uint16_t request, ca_uint32_t payloadSize, ca_uint16_t dataType, ca_uint32_t nElem, ca_uint32_t cid, ca_uint32_t requestDependent, bool v49Ok)
 
void insertRequestWithPayLoad (ca_uint16_t request, unsigned dataType, arrayElementCount nElem, ca_uint32_t cid, ca_uint32_t requestDependent, const void *pPayload, bool v49Ok)
 
comBufpopNextComBufToSend ()
 

Friends

class comQueSendMsgMinder
 

Detailed Description

Definition at line 53 of file comQueSend.h.

Constructor & Destructor Documentation

comQueSend::comQueSend ( wireSendAdapter wireIn,
comBufMemoryManager comBufMemMgrIn 
)

Definition at line 80 of file comQueSend.cpp.

81  :
82  comBufMemMgr ( comBufMemMgrIn ), wire ( wireIn ),
83  nBytesPending ( 0u )
84 {
85 }
comQueSend::~comQueSend ( )

Definition at line 87 of file comQueSend.cpp.

88 {
89  this->clear ();
90 }
void clear()
Definition: comQueSend.cpp:92

Member Function Documentation

void comQueSend::clear ( )

Definition at line 92 of file comQueSend.cpp.

93 {
94  comBuf *pBuf;
95 
96  while ( ( pBuf = this->bufs.get () ) ) {
97  this->nBytesPending -= pBuf->occupiedBytes ();
98  pBuf->~comBuf ();
99  this->comBufMemMgr.release ( pBuf );
100  }
101  this->pFirstUncommited = tsDLIter < comBuf > ();
102  assert ( this->nBytesPending == 0 );
103 }
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
unsigned occupiedBytes() const
Definition: comBuf.h:152
T * get()
Definition: tsDLList.h:261
Definition: comBuf.h:75
virtual void release(void *)=0
bool comQueSend::flushBlockThreshold ( ) const
inline

Definition at line 221 of file comQueSend.h.

222 {
223  return ( this->nBytesPending > 16 * comBuf::capacityBytes () );
224 }
static unsigned capacityBytes()
Definition: comBuf.h:171
bool comQueSend::flushEarlyThreshold ( unsigned  nBytesThisMsg) const
inline

Definition at line 226 of file comQueSend.h.

227 {
228  return ( this->nBytesPending + nBytesThisMsg > 4 * comBuf::capacityBytes () );
229 }
static unsigned capacityBytes()
Definition: comBuf.h:171
void comQueSend::insertRequestHeader ( ca_uint16_t  request,
ca_uint32_t  payloadSize,
ca_uint16_t  dataType,
ca_uint32_t  nElem,
ca_uint32_t  cid,
ca_uint32_t  requestDependent,
bool  v49Ok 
)

Definition at line 279 of file comQueSend.cpp.

283 {
284  if ( payloadSize < 0xffff && nElem < 0xffff ) {
285  comBuf * pComBuf = this->bufs.last ();
286  if ( ! pComBuf || pComBuf->unoccupiedBytes() < 16u ) {
287  pComBuf = newComBuf ();
288  this->pushComBuf ( *pComBuf );
289  }
290  pComBuf->push ( request );
291  pComBuf->push ( static_cast < ca_uint16_t > ( payloadSize ) );
292  pComBuf->push ( dataType );
293  pComBuf->push ( static_cast < ca_uint16_t > ( nElem ) );
294  pComBuf->push ( cid );
295  pComBuf->push ( requestDependent );
296  }
297  else if ( v49Ok ) {
298  comBuf * pComBuf = this->bufs.last ();
299  if ( ! pComBuf || pComBuf->unoccupiedBytes() < 24u ) {
300  pComBuf = newComBuf ();
301  this->pushComBuf ( *pComBuf );
302  }
303  pComBuf->push ( request );
304  pComBuf->push ( static_cast < ca_uint16_t > ( 0xffff ) );
305  pComBuf->push ( dataType );
306  pComBuf->push ( static_cast < ca_uint16_t > ( 0u ) );
307  pComBuf->push ( cid );
308  pComBuf->push ( requestDependent );
309  pComBuf->push ( payloadSize );
310  pComBuf->push ( nElem );
311  }
312  else {
313  throw cacChannel::outOfBounds ();
314  }
315 }
unsigned push(comBuf &)
Definition: comBuf.h:162
std::string request
T * last(void) const
Definition: tsDLList.h:199
Definition: comBuf.h:75
unsigned unoccupiedBytes() const
Definition: comBuf.h:147
void comQueSend::insertRequestWithPayLoad ( ca_uint16_t  request,
unsigned  dataType,
arrayElementCount  nElem,
ca_uint32_t  cid,
ca_uint32_t  requestDependent,
const void *  pPayload,
bool  v49Ok 
)

Definition at line 317 of file comQueSend.cpp.

321 {
322  if ( INVALID_DB_REQ ( dataType ) ) {
323  throw cacChannel::badType ();
324  }
325  if ( dataType >= comQueSendCopyDispatchSize ) {
326  throw cacChannel::badType();
327  }
328  ca_uint32_t size = 0u;
329  ca_uint32_t payloadSize = 0u;
330  if ( nElem == 1 ) {
331  if ( dataType == DBR_STRING ) {
332  const char * pStr = static_cast < const char * > ( pPayload );
333  size = strlen ( pStr ) + 1u;
334  if ( size > MAX_STRING_SIZE ) {
335  throw cacChannel::outOfBounds();
336  }
337  payloadSize = CA_MESSAGE_ALIGN ( size );
338  this->insertRequestHeader ( request, payloadSize,
339  static_cast <ca_uint16_t> ( dataType ),
340  nElem, cid, requestDependent, v49Ok );
341  this->pushString ( pStr, size );
342  }
343  else {
344  size = dbr_size[dataType];
345  payloadSize = CA_MESSAGE_ALIGN ( size );
346  this->insertRequestHeader ( request, payloadSize,
347  static_cast <ca_uint16_t> ( dataType ),
348  nElem, cid, requestDependent, v49Ok );
349  ( this->*dbrCopyScalar [dataType] ) ( pPayload );
350  }
351  }
352  else {
353  arrayElementCount maxBytes;
354  if ( v49Ok ) {
355  maxBytes = 0xffffffff;
356  }
357  else {
358  maxBytes = MAX_TCP - sizeof ( caHdr );
359  }
360  arrayElementCount maxElem =
361  ( maxBytes - sizeof (dbr_double_t) - dbr_size[dataType] ) /
362  dbr_value_size[dataType];
363  if ( nElem >= maxElem ) {
364  throw cacChannel::outOfBounds();
365  }
366  // the above checks verify that the total size
367  // is lest that 0xffffffff
368  size = static_cast < ca_uint32_t >
369  ( dbr_size_n ( dataType, nElem ) );
370  payloadSize = CA_MESSAGE_ALIGN ( size );
371  this->insertRequestHeader ( request, payloadSize,
372  static_cast <ca_uint16_t> ( dataType ),
373  static_cast < ca_uint32_t > ( nElem ),
374  cid, requestDependent, v49Ok );
375  ( this->*dbrCopyVector [dataType] ) ( pPayload, nElem );
376  }
377  // set pad bytes to nill
378  unsigned padSize = payloadSize - size;
379  if ( padSize ) {
380  this->pushString ( cacNillBytes, payloadSize - size );
381  }
382 }
#define DBR_STRING
Definition: db_access.h:69
#define MAX_TCP
Definition: caProto.h:63
const unsigned short dbr_value_size[LAST_BUFFER_TYPE+1]
Definition: access.cpp:896
const unsigned short dbr_size[LAST_BUFFER_TYPE+1]
Definition: access.cpp:847
std::string request
void pushString(const char *pVal, unsigned nChar)
Definition: comQueSend.h:203
unsigned int ca_uint32_t
Definition: caProto.h:76
#define INVALID_DB_REQ(x)
Definition: db_access.h:115
#define CA_MESSAGE_ALIGN(A)
Definition: caProto.h:154
const char cacNillBytes[]
Definition: comQueSend.cpp:74
epicsFloat64 dbr_double_t
Definition: db_access.h:47
struct ca_hdr caHdr
unsigned long arrayElementCount
Definition: cacIO.h:57
#define MAX_STRING_SIZE
Definition: epicsTypes.h:65
#define dbr_size_n(TYPE, COUNT)
Definition: db_access.h:518
void insertRequestHeader(ca_uint16_t request, ca_uint32_t payloadSize, ca_uint16_t dataType, ca_uint32_t nElem, ca_uint32_t cid, ca_uint32_t requestDependent, bool v49Ok)
Definition: comQueSend.cpp:279
#define comQueSendCopyDispatchSize
Definition: comQueSend.h:34
unsigned comQueSend::occupiedBytes ( ) const
inline

Definition at line 216 of file comQueSend.h.

217 {
218  return this->nBytesPending;
219 }
comBuf * comQueSend::popNextComBufToSend ( )

Definition at line 259 of file comQueSend.cpp.

260 {
261  comBuf *pBuf = this->bufs.get ();
262  if ( pBuf ) {
263  unsigned nBytesThisBuf = pBuf->occupiedBytes ();
264  if ( nBytesThisBuf ) {
265  assert ( this->nBytesPending >= nBytesThisBuf );
266  this->nBytesPending -= nBytesThisBuf;
267  }
268  else {
269  this->bufs.push ( *pBuf );
270  pBuf = 0;
271  }
272  }
273  else {
274  assert ( this->nBytesPending == 0u );
275  }
276  return pBuf;
277 }
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
unsigned occupiedBytes() const
Definition: comBuf.h:152
T * get()
Definition: tsDLList.h:261
Definition: comBuf.h:75
void push(T &item)
Definition: tsDLList.h:416
void comQueSend::pushFloat32 ( const ca_float32_t  value)
inline

Definition at line 198 of file comQueSend.h.

199 {
200  this->push ( value );
201 }
Definition: link.h:174
void comQueSend::pushString ( const char *  pVal,
unsigned  nChar 
)
inline

Definition at line 203 of file comQueSend.h.

204 {
205  this->push ( pVal, nChar );
206 }
void comQueSend::pushUInt16 ( const ca_uint16_t  value)
inline

Definition at line 188 of file comQueSend.h.

189 {
190  this->push ( value );
191 }
Definition: link.h:174
void comQueSend::pushUInt32 ( const ca_uint32_t  value)
inline

Definition at line 193 of file comQueSend.h.

194 {
195  this->push ( value );
196 }
Definition: link.h:174

Friends And Related Function Documentation

friend class comQueSendMsgMinder
friend

Definition at line 110 of file comQueSend.h.


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