mrfioc2  2.3.0
Classes | Public Member Functions | Protected Member Functions | List of all members
bufRxManager Class Reference

#include <bufrxmgr.h>

Inheritance diagram for bufRxManager:
Inheritance graph
[legend]
Collaboration diagram for bufRxManager:
Collaboration graph
[legend]

Public Member Functions

 bufRxManager (const std::string &, unsigned int qdepth, unsigned int bsize=0)
 
virtual ~bufRxManager ()
 
unsigned int bsize ()
 
epicsUInt8 * getFree (unsigned int *)
 
void receive (epicsUInt8 *, unsigned int)
 
virtual void dataRxError (dataBufComplete, void *) OVERRIDE FINAL
 Notification if Rx queue overflows. More...
 
virtual void dataRxAddReceive (dataBufComplete fptr, void *arg=0) OVERRIDE FINAL
 Register to receive data buffers. More...
 
virtual void dataRxDeleteReceive (dataBufComplete fptr, void *arg=0) OVERRIDE FINAL
 Unregister. More...
 
- Public Member Functions inherited from dataBufRx
 dataBufRx (const std::string &n)
 
virtual ~dataBufRx ()=0
 
virtual bool dataRxEnabled () const =0
 
virtual void dataRxEnable (bool)=0
 
- Public Member Functions inherited from mrf::ObjectInst< dataBufRx >
virtual propertyBasegetPropertyBase (const char *pname, const std::type_info &ptype)
 
virtual void visitProperties (bool(*cb)(propertyBase *, void *), void *arg)
 
- Public Member Functions inherited from mrf::Object
const std::string & name () const
 
const Objectparent () const
 
virtual void lock () const =0
 
virtual void unlock () const =0
 
child_iterator beginChild () const
 
child_iterator endChild () const
 
template<typename P >
mrf::auto_ptr< property< P > > getProperty (const char *pname)
 

Protected Member Functions

void haderror (epicsStatus e)
 
- Protected Member Functions inherited from mrf::ObjectInst< dataBufRx >
 ObjectInst (const std::string &n)
 
 ObjectInst (const std::string &n, A &a)
 
virtual ~ObjectInst ()
 
- Protected Member Functions inherited from mrf::Object
 Object (const std::string &n, const Object *par=0)
 
virtual ~Object ()=0
 

Additional Inherited Members

- Public Types inherited from mrf::Object
typedef m_obj_children_t::const_iterator child_iterator
 
typedef std::map< std::string, std::string > create_args_t
 
typedef Object *(* create_factory_t) (const std::string &name, const std::string &klass, const create_args_t &args)
 
- Static Public Member Functions inherited from mrf::ObjectInst< dataBufRx >
static int initObject ()
 
- Static Public Member Functions inherited from mrf::Object
static ObjectgetObject (const std::string &name)
 
static ObjectgetCreateObject (const std::string &name, const std::string &klass, const create_args_t &args=create_args_t())
 
static void addFactory (const std::string &klass, create_factory_t fn)
 
static void visitObjects (bool(*)(Object *, void *), void *)
 

Detailed Description

Definition at line 21 of file bufrxmgr.h.

Constructor & Destructor Documentation

◆ bufRxManager()

bufRxManager::bufRxManager ( const std::string &  n,
unsigned int  qdepth,
unsigned int  bsize = 0 
)

Definition at line 63 of file bufrxmgr.cpp.

64  :dataBufRx(n)
65  ,guard()
66  ,onerror(defaulterr)
67  ,onerror_arg(NULL)
68  ,m_bsize(bsize ? bsize : 2048)
69 {
70  ellInit(&dispatch);
71  ellInit(&freebufs);
72  ellInit(&usedbufs);
73 
74  CBINIT(&received_cb, priorityMedium, &bufRxManager::received, this);
75 
76  for(unsigned int i=0; i<qdepth; i++) {
77  buffer *t=(buffer*)callocMustSucceed(1, sizeof(buffer)-1+m_bsize, "bufRxManager buffer");
78  ellAdd(&freebufs, &t->node);
79  }
80 }
unsigned int bsize()
Definition: bufrxmgr.h:28
dataBufRx(const std::string &n)
Definition: databuf.h:64
#define CBINIT(ptr, prio, fn, valptr)
Definition: bufrxmgr.cpp:41

◆ ~bufRxManager()

bufRxManager::~bufRxManager ( )
virtual

Definition at line 82 of file bufrxmgr.cpp.

83 {
84  ELLNODE *node, *next;
85 
86  SCOPED_LOCK(guard);
87 
88  for(node=ellFirst(&freebufs), next=node ? ellNext(node):NULL;
89  node;
90  node=next, next=next ? ellNext(next) : NULL)
91  {
92  buffer *b=CONTAINER(node, buffer, node);
93  free(b);
94  }
95 }
#define CONTAINER(ptr, structure, member)
Definition: bufrxmgr.cpp:36

Member Function Documentation

◆ bsize()

unsigned int bufRxManager::bsize ( )
inline

Definition at line 28 of file bufrxmgr.h.

28 {return m_bsize;};

◆ dataRxAddReceive()

void bufRxManager::dataRxAddReceive ( dataBufComplete  fptr,
void *  arg = 0 
)
virtual

Register to receive data buffers.

Parameters
idReceive buffers with this Protocol ID.
fptr[in]Function pointer invoken after Rx
arg[in]Arbitrary pointer passed to completion function

Implements dataBufRx.

Definition at line 191 of file bufrxmgr.cpp.

192 {
193  listener *l;
194 
195  SCOPED_LOCK(guard);
196 
197  for(ELLNODE *node=ellFirst(&dispatch); node; node=ellNext(node))
198  {
199  l=CONTAINER(node, listener, node);
200  // Don't add duplicates
201  if (l->fn==fn && l->fnarg==arg) {
202  return;
203  }
204  }
205 
206  l=new listener;
207  l->fn=fn;
208  l->fnarg=arg;
209 
210  ellAdd(&dispatch, &l->node);
211 }
#define CONTAINER(ptr, structure, member)
Definition: bufrxmgr.cpp:36

◆ dataRxDeleteReceive()

void bufRxManager::dataRxDeleteReceive ( dataBufComplete  fptr,
void *  arg = 0 
)
virtual

Unregister.

Implements dataBufRx.

Definition at line 214 of file bufrxmgr.cpp.

215 {
216  listener *l;
217 
218  SCOPED_LOCK(guard);
219 
220  for(ELLNODE *node=ellFirst(&dispatch); node; node=ellNext(node))
221  {
222  l=CONTAINER(node, listener, node);
223  if (l->fn==fn && l->fnarg==arg) {
224  ellDelete(&dispatch, node);
225  delete l;
226  return;
227  }
228  }
229 }
#define CONTAINER(ptr, structure, member)
Definition: bufrxmgr.cpp:36

◆ dataRxError()

void bufRxManager::dataRxError ( dataBufComplete  fn,
void *  arg 
)
virtual

Notification if Rx queue overflows.

If the queue overflows then the function is invoked with 'len' zero and 'buf' NULL. If a buffer with a length greater then the given maxlen is received then the function is invoked with 'len' set to the length of the discarded buffer and 'buf' NULL.

Implements dataBufRx.

Definition at line 183 of file bufrxmgr.cpp.

184 {
185  SCOPED_LOCK(guard);
186  onerror=fn;
187  onerror_arg=arg;
188 }

◆ getFree()

epicsUInt8 * bufRxManager::getFree ( unsigned int *  blen)

Definition at line 98 of file bufrxmgr.cpp.

99 {
100  ELLNODE *node;
101  {
102  SCOPED_LOCK(guard);
103  node=ellGet(&freebufs);
104  }
105 
106  if (!node)
107  return NULL;
108 
109  buffer *buf=CONTAINER(node, buffer, node);
110 
111  if (blen) *blen=bsize();
112 
113  buf->used=0;
114  return buf->data;
115 }
#define CONTAINER(ptr, structure, member)
Definition: bufrxmgr.cpp:36
unsigned int bsize()
Definition: bufrxmgr.h:28

◆ haderror()

void bufRxManager::haderror ( epicsStatus  e)
inlineprotected

Definition at line 71 of file bufrxmgr.h.

71 {onerror(onerror_arg,e,0,NULL);}

◆ receive()

void bufRxManager::receive ( epicsUInt8 *  raw,
unsigned int  usedlen 
)

Definition at line 118 of file bufrxmgr.cpp.

119 {
120  /* CONTAINER doesn't work when the member is a pointer
121  * because the GNU version's check isn't correct
122  buffer *buf=CONTAINER(raw, buffer, data);
123  */
124  buffer *buf=(buffer*)((char*)(raw) - offsetof(buffer, data));
125 
126  if (usedlen>bsize())
127  throw std::out_of_range("User admitted overflowing Rx buffer");
128  buf->used=usedlen;
129 
130  if (usedlen==0) {
131  // buffer returned w/o being used
132  {
133  SCOPED_LOCK(guard);
134  ellAdd(&freebufs, &buf->node);
135  }
136  if(evrMrmSeqRxDebug>=2) {
137  errlogPrintf("buffer ignored\n");
138  }
139  return;
140  }
141 
142  {
143  SCOPED_LOCK(guard);
144  ellAdd(&usedbufs, &buf->node);
145  }
146 
147  callbackRequest(&received_cb);
148 }
int evrMrmSeqRxDebug
Definition: drvem.cpp:62
unsigned int bsize()
Definition: bufrxmgr.h:28

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