This is Unofficial EPICS BASE Doxygen Site
epics::pvAccess::fair_queue< T > Class Template Reference

#include "fairQueue.h"

Classes

class  entry
 

Public Types

typedef std::tr1::shared_ptr< T > value_type
 

Public Member Functions

 fair_queue ()
 
 ~fair_queue ()
 
void clear ()
 
bool empty () const
 
void push_back (const value_type &ent)
 
bool pop_front_try (value_type &ret)
 
void pop_front (value_type &ret)
 
bool pop_front (value_type &ret, double timeout)
 

Detailed Description

template<typename T>
class epics::pvAccess::fair_queue< T >

Definition at line 59 of file fairQueue.h.

Member Typedef Documentation

template<typename T>
typedef std::tr1::shared_ptr<T> epics::pvAccess::fair_queue< T >::value_type

Definition at line 63 of file fairQueue.h.

Constructor & Destructor Documentation

template<typename T>
epics::pvAccess::fair_queue< T >::fair_queue ( )
inline

Definition at line 98 of file fairQueue.h.

99  {
100  ellInit(&list);
101  }
#define ellInit(PLIST)
Initialize a list type.
Definition: ellLib.h:76
template<typename T>
epics::pvAccess::fair_queue< T >::~fair_queue ( )
inline

Definition at line 102 of file fairQueue.h.

103  {
104  clear();
105  assert(ellCount(&list)==0);
106  }
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
#define ellCount(PLIST)
Report the number of nodes in a list.
Definition: ellLib.h:84

Member Function Documentation

template<typename T>
void epics::pvAccess::fair_queue< T >::clear ( )
inline

Remove all items.

Postcondition
empty()==true

Definition at line 110 of file fairQueue.h.

111  {
112  // destroy after unlock
113  std::vector<value_type> garbage;
114  {
115  guard_t G(mutex);
116 
117  garbage.resize(unsigned(ellCount(&list)));
118  size_t i=0;
119 
120  while(ELLNODE *cur = ellGet(&list)) {
121  typedef typename entry::enode_t enode_t;
122  enode_t *PN = CONTAINER(cur, enode_t, node);
123  entry *P = PN->self;
124  assert(P->owner==this);
125  assert(P->Qcnt>0);
126 
127  PN->node.previous = PN->node.next = NULL;
128  P->owner = NULL;
129  P->Qcnt = 0u;
130  garbage[i++].swap(P->holder);
131  }
132  }
133  }
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
#define ellCount(PLIST)
Report the number of nodes in a list.
Definition: ellLib.h:84
#define CONTAINER(ptr, structure, member)
Find parent object from a member pointer.
Definition: dbDefs.h:66
int i
Definition: scan.c:967
ELLNODE * ellGet(ELLLIST *pList)
Deletes and returns the first node from a list.
Definition: ellLib.c:147
#define NULL
Definition: catime.c:38
List node type.
Definition: ellLib.h:45
template<typename T>
bool epics::pvAccess::fair_queue< T >::empty ( ) const
inline

Definition at line 135 of file fairQueue.h.

135  {
136  guard_t G(mutex);
137  return ellFirst(&list)==NULL;
138  }
#define NULL
Definition: catime.c:38
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89
template<typename T>
void epics::pvAccess::fair_queue< T >::pop_front ( value_type ret)
inline

Definition at line 188 of file fairQueue.h.

189  {
190  while(1) {
191  pop_front_try(ret);
192  if(ret)
193  break;
194  wakeup.wait();
195  }
196  }
bool pop_front_try(value_type &ret)
Definition: fairQueue.h:160
template<typename T>
bool epics::pvAccess::fair_queue< T >::pop_front ( value_type ret,
double  timeout 
)
inline

Definition at line 198 of file fairQueue.h.

199  {
200  while(1) {
201  pop_front_try(ret);
202  if(ret)
203  return true;
204  if(!wakeup.wait(timeout))
205  return false;
206  }
207  }
double timeout
Definition: pvutils.cpp:25
bool pop_front_try(value_type &ret)
Definition: fairQueue.h:160
template<typename T>
bool epics::pvAccess::fair_queue< T >::pop_front_try ( value_type ret)
inline

Definition at line 160 of file fairQueue.h.

161  {
162  ret.reset();
163  guard_t G(mutex);
164  ELLNODE *cur = ellGet(&list); // pop_front
165 
166  if(cur) {
167  typedef typename entry::enode_t enode_t;
168  enode_t *PN = CONTAINER(cur, enode_t, node);
169  entry *P = PN->self;
170  assert(P->owner==this);
171  assert(P->Qcnt>0);
172  if(--P->Qcnt==0) {
173  PN->node.previous = PN->node.next = NULL;
174  P->owner = NULL;
175 
176  ret.swap(P->holder);
177  } else {
178  ellAdd(&list, &P->enode.node); // push_back
179 
180  ret = P->holder;
181  }
182  return true;
183  } else {
184  return false;
185  }
186  }
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
#define CONTAINER(ptr, structure, member)
Find parent object from a member pointer.
Definition: dbDefs.h:66
ELLNODE * ellGet(ELLLIST *pList)
Deletes and returns the first node from a list.
Definition: ellLib.c:147
#define NULL
Definition: catime.c:38
void ellAdd(ELLLIST *pList, ELLNODE *pNode)
Adds a node to the end of a list.
Definition: ellLib.c:24
List node type.
Definition: ellLib.h:45
template<typename T>
void epics::pvAccess::fair_queue< T >::push_back ( const value_type ent)
inline

Definition at line 140 of file fairQueue.h.

141  {
142  bool wake;
143  entry *P = ent.get();
144  {
145  guard_t G(mutex);
146  wake = ellFirst(&list)==NULL; // empty queue
147 
148  if(P->Qcnt++==0) {
149  // not in list
150  assert(P->owner==NULL);
151  P->owner = this;
152  P->holder = ent; // the list will hold a reference
153  ellAdd(&list, &P->enode.node); // push_back
154  } else
155  assert(P->owner==this);
156  }
157  if(wake) wakeup.signal();
158  }
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
#define NULL
Definition: catime.c:38
void ellAdd(ELLLIST *pList, ELLNODE *pNode)
Adds a node to the end of a list.
Definition: ellLib.c:24
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89

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