This queue implementation enables a producer and a consumer to communicate via a queue. More...
 | 
 Data Structures | 
| struct   | CircQueueStruct | 
|   | The simple version of pcqueue has dropped the function of being expanded if the queue is full.  More...
  | 
| struct   | PCQueueStruct | 
|   | The beginning of definitions for simple pcqueue.  More...
  | 
| struct   | PCQueueStruct | 
|   | The beginning of definitions for simple pcqueue.  More...
  | 
| struct   | FreeNodePoolStruct | 
| struct   | MPSCQueueStruct | 
| struct   | MPMCDataNodeStruct | 
| struct   | FreeMPMCNodePoolStruct | 
| struct   | MPMCQueueStruct | 
 Typedefs | 
| typedef struct CircQueueStruct *  | CircQueue | 
| typedef struct PCQueueStruct *  | PCQueue | 
| typedef char **  | DataNode | 
| typedef struct FreeNodePoolStruct *  | FreeNodePool | 
| typedef struct MPSCQueueStruct *  | MPSCQueue | 
| typedef struct MPMCDataNodeStruct *  | MPMCDataNode | 
typedef struct  
FreeMPMCNodePoolStruct *  | FreeMPMCNodePool | 
| typedef struct MPMCQueueStruct *  | MPMCQueue | 
 Functions | 
| static PCQueue  | PCQueueCreate (void) | 
| static void  | PCQueueDestroy (PCQueue Q) | 
| static int  | PCQueueEmpty (PCQueue Q) | 
| static int  | PCQueueLength (PCQueue Q) | 
| static char *  | PCQueueTop (PCQueue Q) | 
| static char *  | PCQueuePop (PCQueue Q) | 
| static void  | PCQueuePush (PCQueue Q, char *data) | 
| void  | ReportOverflow () | 
| static unsigned int  | WrappedDifference (unsigned int push, unsigned int pull) | 
| static int  | QueueFull (unsigned int push, unsigned int pull) | 
| static DataNode  | DataNodeCreate (void) | 
| static FreeNodePool  | FreeNodePoolCreate (void) | 
| static void  | FreeNodePoolDestroy (FreeNodePool q) | 
| static DataNode  | get_free_node (FreeNodePool q) | 
| static void  | add_free_node (FreeNodePool q, DataNode available) | 
| static MPSCQueue  | MPSCQueueCreate (void) | 
| static void  | MPSCQueueDestroy (MPSCQueue Q) | 
| static unsigned int  | get_node_index (unsigned int value) | 
| static DataNode  | get_push_node (MPSCQueue Q, unsigned int push_idx) | 
| static DataNode  | get_pop_node (MPSCQueue Q, unsigned int pull_idx) | 
| static void  | check_mem_reclamation (MPSCQueue Q, unsigned int pull_idx, DataNode node) | 
| static int  | MPSCQueueEmpty (MPSCQueue Q) | 
| static int  | MPSCQueueLength (MPSCQueue Q) | 
| static char *  | MPSCQueueTop (MPSCQueue Q) | 
| static char *  | MPSCQueuePop (MPSCQueue Q) | 
| static void  | MPSCQueuePush (MPSCQueue Q, char *data) | 
| static MPMCDataNode  | MPMCDataNodeCreate (void) | 
| static FreeMPMCNodePool  | FreeMPMCNodePoolCreate (void) | 
| static void  | FreeMPMCNodePoolDestroy (FreeMPMCNodePool q) | 
| static MPMCDataNode  | mpmc_get_free_node (FreeMPMCNodePool q) | 
| static void  | mpmc_add_free_node (FreeMPMCNodePool q, MPMCDataNode available) | 
| static MPMCQueue  | MPMCQueueCreate (void) | 
| static void  | MPMCQueueDestroy (MPMCQueue Q) | 
| static MPMCDataNode  | mpmc_get_push_node (MPMCQueue Q, unsigned int push_idx) | 
| static MPMCDataNode  | mpmc_get_pop_node (MPMCQueue Q, unsigned int pull_idx) | 
| static void  | mpmc_check_mem_reclamation (MPMCQueue Q, unsigned int pull_idx, MPMCDataNode node) | 
| static int  | MPMCQueueEmpty (MPMCQueue Q) | 
| static int  | MPMCQueueLength (MPMCQueue Q) | 
| static char *  | MPMCQueueTop (MPMCQueue Q) | 
| static char *  | MPMCQueuePop (MPMCQueue Q) | 
| static void  | MPMCQueuePush (MPMCQueue Q, void *data) | 
 Variables | 
| int  | DataNodeSize | 
| int  | MaxDataNodes | 
| int  | QueueUpperBound | 
| int  | DataNodeWrap | 
| int  | QueueWrap | 
| int  | messageQueueOverflow | 
This queue implementation enables a producer and a consumer to communicate via a queue. 
The queues are optimized for this situation, they don't require any operating system locks (they do require 32-bit reads and writes to be atomic.) Cautions: there can only be one producer, and one consumer. These queues cannot store null pointers.