[commtech] CSQ use memcpy in dequeue for fairness

Paper about CSQ uses memcpy in enqueue and dequeue. Although it is not
possible to use memcpy in enqueue because of current API, it is possible
to use memcpy in dequeue, hence this commit.
This commit is contained in:
Thomas Preud'homme 2011-01-19 11:43:52 +01:00
parent 7db514a706
commit 5eb7fb50c7
1 changed files with 5 additions and 9 deletions

View File

@ -1,5 +1,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
@ -89,21 +90,16 @@ void *recv_one_data(void)
ssize_t recv_some_data(void **buf, size_t count)
{
int i, n;
int n;
n = 0;
// If all slots are empty, spin
while (comm->queue[ctrl.head].flag)
{
// Dequeue a chunk of data items
for (i = 0; i < SUB_SLOTS; i++)
{
/*
* The behaviour of this is not documented but we know
* the values inside buf won't change during this affectation
*/
*buf++ = comm->queue[ctrl.head].chunk[i];
}
memcpy(buf, (const void *)
comm->queue[ctrl.head].chunk,
SUB_SLOTS * sizeof(*buf));
n += SUB_SLOTS;
comm->queue[ctrl.head].flag = 0;
ctrl.head = (ctrl.head + 1) % SLOTS;