#include <FWCore/Utilities/interface/SingleConsumerQ.h>
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.
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 | ( | ) |
edm::SingleConsumerQ::SingleConsumerQ | ( | const SingleConsumerQ & | ) | [private] |
Definition at line 96 of file SingleConsumerQ.cc.
References releaseProducerBuffer().
Referenced by edm::SingleConsumerQ::ConsumerType::commit().
00097 { 00098 releaseProducerBuffer(v); 00099 }
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_; }
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 }
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 }
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] |
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().