There don't appear to be any memory barriers in your code. How are you
avoiding the issue of out-of-order execution on multiprocessor machines?
Chris
On 26 Mar 2009, at 08:12, "romandion78" <romandion78@...> wrote:
> 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 ;
> }
>
>
>
> ------------------------------------
>
> Yahoo! Groups Links
>
>
>