pipewire/spa/tests/stress-ringbuffer.c

113 lines
2.2 KiB
C
Raw Normal View History

2017-04-25 19:22:06 +02:00
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <sched.h>
#include <spa/utils/ringbuffer.h>
2017-04-25 19:22:06 +02:00
#define DEFAULT_SIZE 0x2000
#define ARRAY_SIZE 63
2017-04-25 19:22:06 +02:00
#define MAX_VALUE 0x10000
struct spa_ringbuffer rb;
int32_t size;
2017-04-25 19:22:06 +02:00
uint8_t *data;
2017-05-26 08:05:01 +02:00
static int fill_int_array(int *array, int start, int count)
2017-04-25 19:22:06 +02:00
{
2017-05-26 08:05:01 +02:00
int i, j = start;
for (i = 0; i < count; i++) {
array[i] = j;
j = (j + 1) % MAX_VALUE;
}
return j;
2017-04-25 19:22:06 +02:00
}
2017-05-26 08:05:01 +02:00
static int cmp_array(int *array1, int *array2, int count)
2017-04-25 19:22:06 +02:00
{
2017-05-26 08:05:01 +02:00
int i;
for (i = 0; i < count; i++)
if (array1[i] != array2[i]) {
printf("%d != %d at offset %d\n", array1[i], array2[i], i);
return 0;
}
return 1;
2017-04-25 19:22:06 +02:00
}
2017-05-26 08:05:01 +02:00
static void *reader_start(void *arg)
2017-04-25 19:22:06 +02:00
{
2017-05-26 08:05:01 +02:00
int i = 0, a[ARRAY_SIZE], b[ARRAY_SIZE];
2017-04-25 19:22:06 +02:00
2017-05-26 08:05:01 +02:00
printf("reader started on cpu: %d\n", sched_getcpu());
2017-04-25 19:22:06 +02:00
2017-05-26 08:05:01 +02:00
i = fill_int_array(a, i, ARRAY_SIZE);
2017-04-25 19:22:06 +02:00
2017-05-26 08:05:01 +02:00
while (1) {
uint32_t index;
int32_t avail;
2017-04-25 19:22:06 +02:00
avail = spa_ringbuffer_get_read_index(&rb, &index);
if (avail >= (int32_t)(sizeof(b))) {
spa_ringbuffer_read_data(&rb, data, size, index % size, b, sizeof(b));
spa_ringbuffer_read_update(&rb, index + sizeof(b));
2017-04-25 19:22:06 +02:00
spa_assert(cmp_array(a, b, ARRAY_SIZE));
i = fill_int_array(a, i, ARRAY_SIZE);
2017-05-26 08:05:01 +02:00
}
}
2017-04-25 19:22:06 +02:00
2017-05-26 08:05:01 +02:00
return NULL;
2017-04-25 19:22:06 +02:00
}
2017-05-26 08:05:01 +02:00
static void *writer_start(void *arg)
2017-04-25 19:22:06 +02:00
{
2017-05-26 08:05:01 +02:00
int i = 0, a[ARRAY_SIZE];
printf("writer started on cpu: %d\n", sched_getcpu());
2017-04-25 19:22:06 +02:00
2017-05-26 08:05:01 +02:00
i = fill_int_array(a, i, ARRAY_SIZE);
2017-04-25 19:22:06 +02:00
2017-05-26 08:05:01 +02:00
while (1) {
uint32_t index;
int32_t avail;
2017-04-25 19:22:06 +02:00
avail = size - spa_ringbuffer_get_write_index(&rb, &index);
if (avail >= (int32_t)(sizeof(a))) {
spa_ringbuffer_write_data(&rb, data, size, index % size, a, sizeof(a));
spa_ringbuffer_write_update(&rb, index + sizeof(a));
2017-04-25 19:22:06 +02:00
2017-05-26 08:05:01 +02:00
i = fill_int_array(a, i, ARRAY_SIZE);
}
}
2017-04-25 19:22:06 +02:00
2017-05-26 08:05:01 +02:00
return NULL;
2017-04-25 19:22:06 +02:00
}
int main(int argc, char *argv[])
{
2017-05-26 08:05:01 +02:00
printf("starting ringbuffer stress test\n");
2017-04-25 19:22:06 +02:00
if (argc > 1)
sscanf(argv[1], "%d", &size);
else
size = DEFAULT_SIZE;
2017-04-25 19:22:06 +02:00
2017-05-26 08:05:01 +02:00
printf("buffer size (bytes): %d\n", size);
printf("array size (bytes): %ld\n", sizeof(int) * ARRAY_SIZE);
2017-04-25 19:22:06 +02:00
spa_ringbuffer_init(&rb);
2017-05-26 08:05:01 +02:00
data = malloc(size);
2017-04-25 19:22:06 +02:00
2017-05-26 08:05:01 +02:00
pthread_t reader_thread, writer_thread;
pthread_create(&reader_thread, NULL, reader_start, NULL);
pthread_create(&writer_thread, NULL, writer_start, NULL);
2017-04-25 19:22:06 +02:00
sleep(5);
printf("read %u, written %u\n", rb.readindex, rb.writeindex);
2017-04-25 19:22:06 +02:00
2017-05-26 08:05:01 +02:00
return 0;
2017-04-25 19:22:06 +02:00
}