DataStructures::SingleProducerConsumer< SingleProducerConsumerType > Class Template Reference

A single producer consumer implementation without critical sections. More...

#include <SingleProducerConsumer.h>

List of all members.

Public Member Functions

 SingleProducerConsumer ()
 Constructor.
 ~SingleProducerConsumer ()
 Destructor.
SingleProducerConsumerType * WriteLock (void)
void CancelWriteLock (SingleProducerConsumerType *cancelToLocation)
void WriteUnlock (void)
 Call when you are done writing to a block of memory returned by WriteLock().
SingleProducerConsumerType * ReadLock (void)
void CancelReadLock (SingleProducerConsumerType *cancelToLocation)
 param[in] Which ReadLock() to cancel.
void ReadUnlock (void)
void Clear (void)
 Clear is not thread-safe and none of the lock or unlock functions should be called while it is running.
int Size (void) const
bool CheckReadUnlockOrder (const SingleProducerConsumerType *data) const
bool ReadIsLocked (void) const

Private Attributes

volatile DataPlusPtr * readAheadPointer
volatile DataPlusPtr * writeAheadPointer
volatile DataPlusPtr * readPointer
volatile DataPlusPtr * writePointer
unsigned readCount
unsigned writeCount

Classes

struct  DataPlusPtr


Detailed Description

template<class SingleProducerConsumerType>
class DataStructures::SingleProducerConsumer< SingleProducerConsumerType >

A single producer consumer implementation without critical sections.


Member Function Documentation

template<class SingleProducerConsumerType>
void DataStructures::SingleProducerConsumer< SingleProducerConsumerType >::CancelWriteLock SingleProducerConsumerType *  cancelToLocation  ) 
 

Call if you don't want to write to a block of data from WriteLock() after all. Cancelling locks cancels all locks back up to the data passed. So if you lock twice and cancel using the first lock, the second lock is ignored

Parameters:
[in] cancelToLocation Which WriteLock() to cancel.

template<class SingleProducerConsumerType>
bool DataStructures::SingleProducerConsumer< SingleProducerConsumerType >::CheckReadUnlockOrder const SingleProducerConsumerType *  data  )  const
 

Make sure that the pointer we done reading for the call to ReadUnlock is the right pointer. param[in] A previous pointer returned by ReadLock()

template<class SingleProducerConsumerType>
bool DataStructures::SingleProducerConsumer< SingleProducerConsumerType >::ReadIsLocked void   )  const
 

Returns if ReadUnlock was called before ReadLock

Returns:
If the read is locked

template<class SingleProducerConsumerType>
SingleProducerConsumerType * DataStructures::SingleProducerConsumer< SingleProducerConsumerType >::ReadLock void   ) 
 

ReadLock must be immediately followed by ReadUnlock. These two functions must be called in the same thread.

Return values:
0 No data is availble to read
Non-zero The data previously written to, in another thread, by WriteLock followed by WriteUnlock.

template<class SingleProducerConsumerType>
void DataStructures::SingleProducerConsumer< SingleProducerConsumerType >::ReadUnlock void   ) 
 

Signals that we are done reading the the data from the least recent call of ReadLock. At this point that pointer is no longer valid, and should no longer be read.

template<class SingleProducerConsumerType>
int DataStructures::SingleProducerConsumer< SingleProducerConsumerType >::Size void   )  const
 

This function will estimate how many elements are waiting to be read. It's threadsafe enough that the value returned is stable, but not threadsafe enough to give accurate results.

Returns:
An ESTIMATE of how many data elements are waiting to be read

template<class SingleProducerConsumerType>
SingleProducerConsumerType * DataStructures::SingleProducerConsumer< SingleProducerConsumerType >::WriteLock void   ) 
 

WriteLock must be immediately followed by WriteUnlock. These two functions must be called in the same thread.

Returns:
A pointer to a block of data you can write to.


The documentation for this class was generated from the following file:
Generated on Sat Oct 14 08:37:41 2006 for RakNet by  doxygen 1.4.6-NO