I have an idea about lock-free queue without atomic , you can find source code
at http://code.google.com/p/liblfqueue/downloads/list . Any body can send email
to romandion@... . I list the code below and wish your help .
typedef struct _qnode_st qnode_t ;
struct _qnode_st{
qnode_t *next ;
} ;
#define MAX_RING_SIZE 3
typedef struct _queue_st queue_t ;
struct _queue_st{
qnode_t *nodes[MAX_RING_SIZE] ;
int enqueue ;
int dequeue ;
qnode_t *enlast ;
} ;
int enqueue(queue_t *queue , qnode_t *node)
{
int old = queue->enqueue ;
node->next = NULL ;
if(queue->nodes[old] == NULL)
{
queue->enlast = node ;
queue->enqueue++ ;
if(queue->enqueue >= MAX_RING_SIZE)
queue->enqueue = 0 ;
queue->nodes[old] = node ;
}
else
{
queue->enlast->next = node ;
queue->enlast = node ;
}
return 0 ;
}
qnode_t *dequeue(queue_t *queue)
{
int old = queue->dequeue ;
qnode_t *tmp ;
if(queue->nodes[old] == NULL)
return NULL ;
tmp = queue->nodes[old] ;
queue->nodes[old] = tmp->next ;
if(tmp->next == NULL)
{
old++ ;
if(old >= MAX_RING_SIZE)
old = 0 ;
queue->dequeue = old ;
}
return tmp ;
}