CMS 3D CMS Logo

Classes | Public Types | Public Member Functions | Private Types | Private Member Functions | Private Attributes

edm::SingleConsumerQ Class Reference

#include <SingleConsumerQ.h>

List of all members.

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< 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_

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.

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.


Constructor & Destructor Documentation

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

Definition at line 26 of file SingleConsumerQ.cc.

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

Member Function Documentation

void edm::SingleConsumerQ::commitConsumerBuffer ( void *  v,
int   
)
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();
  }

Member Data Documentation

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

Definition at line 127 of file SingleConsumerQ.h.

Referenced by commitProducerBuffer(), and getConsumerBuffer().

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().

Definition at line 121 of file SingleConsumerQ.h.

Referenced by getProducerBuffer(), and maxEventSize().

Definition at line 122 of file SingleConsumerQ.h.

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

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().

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().

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().

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().