CMS 3D CMS Logo

edm::SingleConsumerQ Class Reference

#include <FWCore/Utilities/interface/SingleConsumerQ.h>

List of all members.

Public Types

typedef OperateBuffer
< ConsumerType
ConsumerBuffer
typedef OperateBuffer
< ProducerType
ProducerBuffer

Public Member Functions

void commitConsumerBuffer (void *, int)
void commitProducerBuffer (void *, int)
Buffer getConsumerBuffer ()
Buffer getProducerBuffer ()
int maxEventSize () const
int maxQueueDepth () const
void releaseConsumerBuffer (void *)
void releaseProducerBuffer (void *)
 SingleConsumerQ (int max_event_size, int max_queue_depth)
 ~SingleConsumerQ ()

Private Types

typedef std::vector< char > ByteArray
typedef std::vector< void * > Pool
typedef std::vector< BufferQueue

Private Member Functions

 SingleConsumerQ (const SingleConsumerQ &)

Private Attributes

unsigned int bpos_
Pool buffer_pool_
unsigned int fpos_
int max_event_size_
int max_queue_depth_
ByteArray mem_
boost::condition pool_cond_
boost::mutex pool_lock_
boost::condition pop_cond_
int pos_
boost::condition push_cond_
Queue queue_
boost::mutex queue_lock_

Classes

struct  Buffer
struct  ConsumerType
class  OperateBuffer
struct  ProducerType


Detailed Description

Definition at line 43 of file SingleConsumerQ.h.


Member Typedef Documentation

typedef std::vector<char> edm::SingleConsumerQ::ByteArray [private]

Definition at line 115 of file SingleConsumerQ.h.

typedef OperateBuffer<ConsumerType> edm::SingleConsumerQ::ConsumerBuffer

Definition at line 96 of file SingleConsumerQ.h.

typedef std::vector<void*> edm::SingleConsumerQ::Pool [private]

Definition at line 117 of file SingleConsumerQ.h.

typedef OperateBuffer<ProducerType> edm::SingleConsumerQ::ProducerBuffer

Definition at line 97 of file SingleConsumerQ.h.

typedef std::vector<Buffer> edm::SingleConsumerQ::Queue [private]

Definition at line 119 of file SingleConsumerQ.h.


Constructor & Destructor Documentation

edm::SingleConsumerQ::SingleConsumerQ ( int  max_event_size,
int  max_queue_depth 
)

Definition at line 6 of file SingleConsumerQ.cc.

References buffer_pool_, i, and mem_.

00006                                                                          :
00007     max_event_size_(max_event_size),max_queue_depth_(max_queue_depth),
00008     pos_(max_queue_depth-1),mem_(max_event_size * max_queue_depth),
00009     buffer_pool_(),
00010     queue_(max_queue_depth),
00011     fpos_(),
00012     bpos_(),
00013     pool_lock_(),
00014     queue_lock_(),
00015     pool_cond_(),
00016     pop_cond_(),
00017     push_cond_()
00018   {
00019     // throw if event size 0 or queue depth 0
00020 
00021     for(char* i=&mem_[0];i<&mem_[mem_.size()];i+=max_event_size)
00022       buffer_pool_.push_back(i);
00023 
00024   }

edm::SingleConsumerQ::~SingleConsumerQ (  ) 

Definition at line 26 of file SingleConsumerQ.cc.

00026 { }

edm::SingleConsumerQ::SingleConsumerQ ( const SingleConsumerQ  )  [private]


Member Function Documentation

void edm::SingleConsumerQ::commitConsumerBuffer ( void v,
int   
)

Definition at line 96 of file SingleConsumerQ.cc.

References releaseProducerBuffer().

Referenced by edm::SingleConsumerQ::ConsumerType::commit().

00097   {
00098     releaseProducerBuffer(v);
00099   }

void edm::SingleConsumerQ::commitProducerBuffer ( void v,
int  len 
)

Definition at line 51 of file SingleConsumerQ.cc.

References bpos_, fpos_, max_queue_depth_, pop_cond_, push_cond_, queue_, queue_lock_, and sl.

Referenced by edm::SingleConsumerQ::ProducerType::commit().

00052   {
00053     // get lock
00054     boost::mutex::scoped_lock sl(queue_lock_);
00055     // if full, wait for item to be removed
00056     while((bpos_+max_queue_depth_)==fpos_)
00057       {
00058         push_cond_.wait(sl);
00059       }
00060 
00061     // put buffer into queue
00062     queue_[fpos_ % max_queue_depth_]=Buffer(v,len);
00063     ++fpos_;
00064     // signal consumer
00065     pop_cond_.notify_all();
00066   }

SingleConsumerQ::Buffer edm::SingleConsumerQ::getConsumerBuffer (  ) 

Definition at line 68 of file SingleConsumerQ.cc.

References bpos_, fpos_, max_queue_depth_, pop_cond_, push_cond_, queue_, queue_lock_, sl, and v.

00069   {
00070     // get lock
00071     boost::mutex::scoped_lock sl(queue_lock_);
00072     // if empty, wait for item to appear
00073     while(bpos_==fpos_)
00074       {
00075         pop_cond_.wait(sl);
00076       }
00077     // get a buffer from the queue and return it
00078     Buffer v = queue_[bpos_ % max_queue_depth_];
00079     ++bpos_;
00080     // note that these operations cannot throw
00081     // signal producer
00082     push_cond_.notify_all();
00083     return v;
00084   }

SingleConsumerQ::Buffer edm::SingleConsumerQ::getProducerBuffer (  ) 

Definition at line 28 of file SingleConsumerQ.cc.

References buffer_pool_, max_event_size_, pool_cond_, pool_lock_, pos_, sl, and v.

00029   {
00030     // get lock
00031     boost::mutex::scoped_lock sl(pool_lock_);
00032     // wait for buffer to appear
00033     while(pos_ < 0)
00034       {
00035         pool_cond_.wait(sl);
00036       }
00037     void* v = buffer_pool_[pos_];
00038     --pos_;
00039     return Buffer(v,max_event_size_);
00040   }

int edm::SingleConsumerQ::maxEventSize (  )  const [inline]

Definition at line 107 of file SingleConsumerQ.h.

References max_event_size_.

00107 { return max_event_size_; }

int edm::SingleConsumerQ::maxQueueDepth (  )  const [inline]

Definition at line 108 of file SingleConsumerQ.h.

References max_queue_depth_.

00108 { return max_queue_depth_; }

void edm::SingleConsumerQ::releaseConsumerBuffer ( void v  ) 

Definition at line 86 of file SingleConsumerQ.cc.

References releaseProducerBuffer().

Referenced by edm::SingleConsumerQ::ConsumerType::release().

00087   {
00088     // should the buffer be placed back onto the queue and not released?
00089     // we got here because a commit did to occur in the consumer.
00090     // we will allow consumers to call or not call commit for now, meaning
00091     // that we cannot distinguish between exception conditions and normal
00092     // return.  The buffer will always be released
00093     releaseProducerBuffer(v);
00094   }

void edm::SingleConsumerQ::releaseProducerBuffer ( void v  ) 

Definition at line 42 of file SingleConsumerQ.cc.

References buffer_pool_, pool_cond_, pool_lock_, pos_, and sl.

Referenced by commitConsumerBuffer(), edm::SingleConsumerQ::ProducerType::release(), and releaseConsumerBuffer().

00043   {
00044     // get lock
00045     boost::mutex::scoped_lock sl(pool_lock_);
00046     ++pos_;
00047     buffer_pool_[pos_] = v;
00048     pool_cond_.notify_all();
00049   }


Member Data Documentation

unsigned int edm::SingleConsumerQ::bpos_ [private]

Definition at line 127 of file SingleConsumerQ.h.

Referenced by commitProducerBuffer(), and getConsumerBuffer().

Pool edm::SingleConsumerQ::buffer_pool_ [private]

Definition at line 125 of file SingleConsumerQ.h.

Referenced by getProducerBuffer(), releaseProducerBuffer(), and SingleConsumerQ().

unsigned int edm::SingleConsumerQ::fpos_ [private]

Definition at line 127 of file SingleConsumerQ.h.

Referenced by commitProducerBuffer(), and getConsumerBuffer().

int edm::SingleConsumerQ::max_event_size_ [private]

Definition at line 121 of file SingleConsumerQ.h.

Referenced by getProducerBuffer(), and maxEventSize().

int edm::SingleConsumerQ::max_queue_depth_ [private]

Definition at line 122 of file SingleConsumerQ.h.

Referenced by commitProducerBuffer(), getConsumerBuffer(), and maxQueueDepth().

ByteArray edm::SingleConsumerQ::mem_ [private]

Definition at line 124 of file SingleConsumerQ.h.

Referenced by SingleConsumerQ().

boost::condition edm::SingleConsumerQ::pool_cond_ [private]

Definition at line 131 of file SingleConsumerQ.h.

Referenced by getProducerBuffer(), and releaseProducerBuffer().

boost::mutex edm::SingleConsumerQ::pool_lock_ [private]

Definition at line 129 of file SingleConsumerQ.h.

Referenced by getProducerBuffer(), and releaseProducerBuffer().

boost::condition edm::SingleConsumerQ::pop_cond_ [private]

Definition at line 132 of file SingleConsumerQ.h.

Referenced by commitProducerBuffer(), and getConsumerBuffer().

int edm::SingleConsumerQ::pos_ [private]

Definition at line 123 of file SingleConsumerQ.h.

Referenced by getProducerBuffer(), and releaseProducerBuffer().

boost::condition edm::SingleConsumerQ::push_cond_ [private]

Definition at line 133 of file SingleConsumerQ.h.

Referenced by commitProducerBuffer(), and getConsumerBuffer().

Queue edm::SingleConsumerQ::queue_ [private]

Definition at line 126 of file SingleConsumerQ.h.

Referenced by commitProducerBuffer(), and getConsumerBuffer().

boost::mutex edm::SingleConsumerQ::queue_lock_ [private]

Definition at line 130 of file SingleConsumerQ.h.

Referenced by commitProducerBuffer(), and getConsumerBuffer().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:44:16 2009 for CMSSW by  doxygen 1.5.4