Hi Bob,

>       do {
>               prod_head = r->prod.head;
>               cons_tail = r->cons.tail;
>               prod_next = prod_head + n;
>               success = rte_atomic32_cmpset(&r->prod.head, prod_head, 
> prod_next);
>               
>               /*
>                 * Why not enqueue data here? It would be just a couple of 
> pointers assignment, not taking too much time.
>                 * Then the entire CAS loop contains both pointer adjustment 
> and data enqueue, and the dequeue operation would not have a chance to 
> interfere data producing.
>                 * The next wait loop can be removed accordingly.
>               /*              

You cannot enqueue your data here: before writing the objects, you must
first check that the cmpset is succesful. In your example, if the cmpset
fails, it would write the objects pointer in a zone already reserved
by another producer core.

The writing of objects must be done after the "do - while" loop, once
cmpset is succesful. But even with that, you cannot remove the wait
loop (r->prod.tail != prod_head) for the reasons described in my
previous mail.

The ring test in app/test/test_ring.c is quite stressful for the rings
so you can use it to check that your solution is working.


Regards,
Olivier

Reply via email to