#include <SingleConsumerQ.h>
Classes | |
struct | Buffer |
struct | ConsumerType |
class | OperateBuffer |
struct | ProducerType |
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< Buffer > | Queue |
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_ |
Definition at line 43 of file SingleConsumerQ.h.
typedef std::vector<char> edm::SingleConsumerQ::ByteArray [private] |
Definition at line 115 of file SingleConsumerQ.h.
Definition at line 96 of file SingleConsumerQ.h.
typedef std::vector<void*> edm::SingleConsumerQ::Pool [private] |
Definition at line 117 of file SingleConsumerQ.h.
Definition at line 97 of file SingleConsumerQ.h.
typedef std::vector<Buffer> edm::SingleConsumerQ::Queue [private] |
Definition at line 119 of file SingleConsumerQ.h.
edm::SingleConsumerQ::SingleConsumerQ | ( | int | max_event_size, |
int | max_queue_depth | ||
) |
Definition at line 6 of file SingleConsumerQ.cc.
References buffer_pool_, i, reco_skim_cfg_mod::max_event_size, and mem_.
: max_event_size_(max_event_size),max_queue_depth_(max_queue_depth), pos_(max_queue_depth-1),mem_(max_event_size * max_queue_depth), buffer_pool_(), queue_(max_queue_depth), fpos_(), bpos_(), pool_lock_(), queue_lock_(), pool_cond_(), pop_cond_(), push_cond_() { // throw if event size 0 or queue depth 0 for(char* i=&mem_[0];i<&mem_[mem_.size()];i+=max_event_size) buffer_pool_.push_back(i); }
edm::SingleConsumerQ::~SingleConsumerQ | ( | ) |
Definition at line 26 of file SingleConsumerQ.cc.
{ }
edm::SingleConsumerQ::SingleConsumerQ | ( | const SingleConsumerQ & | ) | [private] |
void edm::SingleConsumerQ::commitConsumerBuffer | ( | void * | v, |
int | |||
) |
Definition at line 96 of file SingleConsumerQ.cc.
References releaseProducerBuffer().
Referenced by edm::SingleConsumerQ::ConsumerType::commit().
{ releaseProducerBuffer(v); }
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_, and queue_lock_.
Referenced by edm::SingleConsumerQ::ProducerType::commit().
{ // get lock boost::mutex::scoped_lock sl(queue_lock_); // if full, wait for item to be removed while((bpos_+max_queue_depth_)==fpos_) { push_cond_.wait(sl); } // put buffer into queue queue_[fpos_ % max_queue_depth_]=Buffer(v,len); ++fpos_; // signal consumer pop_cond_.notify_all(); }
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_, and v.
{ // get lock boost::mutex::scoped_lock sl(queue_lock_); // if empty, wait for item to appear while(bpos_==fpos_) { pop_cond_.wait(sl); } // get a buffer from the queue and return it Buffer v = queue_[bpos_ % max_queue_depth_]; ++bpos_; // note that these operations cannot throw // signal producer push_cond_.notify_all(); return v; }
SingleConsumerQ::Buffer edm::SingleConsumerQ::getProducerBuffer | ( | ) |
Definition at line 28 of file SingleConsumerQ.cc.
References buffer_pool_, max_event_size_, pool_cond_, pool_lock_, pos_, and v.
{ // get lock boost::mutex::scoped_lock sl(pool_lock_); // wait for buffer to appear while(pos_ < 0) { pool_cond_.wait(sl); } void* v = buffer_pool_[pos_]; --pos_; return Buffer(v,max_event_size_); }
int edm::SingleConsumerQ::maxEventSize | ( | ) | const [inline] |
Definition at line 107 of file SingleConsumerQ.h.
References max_event_size_.
{ return max_event_size_; }
int edm::SingleConsumerQ::maxQueueDepth | ( | ) | const [inline] |
Definition at line 108 of file SingleConsumerQ.h.
References max_queue_depth_.
{ 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().
{ // should the buffer be placed back onto the queue and not released? // we got here because a commit did to occur in the consumer. // we will allow consumers to call or not call commit for now, meaning // that we cannot distinguish between exception conditions and normal // return. The buffer will always be released releaseProducerBuffer(v); }
void edm::SingleConsumerQ::releaseProducerBuffer | ( | void * | v | ) |
Definition at line 42 of file SingleConsumerQ.cc.
References buffer_pool_, pool_cond_, pool_lock_, pos_, and v.
Referenced by commitConsumerBuffer(), edm::SingleConsumerQ::ProducerType::release(), and releaseConsumerBuffer().
{ // get lock boost::mutex::scoped_lock sl(pool_lock_); ++pos_; buffer_pool_[pos_] = v; pool_cond_.notify_all(); }
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().
Definition at line 130 of file SingleConsumerQ.h.
Referenced by commitProducerBuffer(), and getConsumerBuffer().