-
Notifications
You must be signed in to change notification settings - Fork 92
Expand file tree
/
Copy pathtests.c
More file actions
70 lines (53 loc) · 1.84 KB
/
tests.c
File metadata and controls
70 lines (53 loc) · 1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdio.h>
#include <stdlib.h>
#include "lfring.h"
#define EX_HASHSTR(s) #s
#define EX_STR(s) EX_HASHSTR(s)
#define EXPECT(exp) \
{ \
if (!(exp)) \
fprintf(stderr, "FAILURE @ %s:%u; %s\n", __FILE__, __LINE__, \
EX_STR(exp)), \
abort(); \
}
static void test_ringbuffer(uint32_t flags)
{
void *vec[4];
uint32_t ret;
uint32_t idx;
lfring_t *rb = lfring_alloc(2, flags);
EXPECT(rb != NULL);
ret = lfring_dequeue(rb, vec, 1, &idx);
EXPECT(ret == 0);
ret = lfring_enqueue(rb, (void *[]){(void *) 1}, 1);
EXPECT(ret == 1);
ret = lfring_dequeue(rb, vec, 1, &idx);
EXPECT(ret == 1);
EXPECT(idx == 0);
EXPECT(vec[0] == (void *) 1);
ret = lfring_dequeue(rb, vec, 1, &idx);
EXPECT(ret == 0);
ret = lfring_enqueue(rb, (void *[]){(void *) 2, (void *) 3, (void *) 4}, 3);
EXPECT(ret == 2);
ret = lfring_dequeue(rb, vec, 1, &idx);
EXPECT(ret == 1);
EXPECT(idx == 1);
EXPECT(vec[0] == (void *) 2);
ret = lfring_dequeue(rb, vec, 4, &idx);
EXPECT(ret == 1);
EXPECT(idx == 2);
EXPECT(vec[0] == (void *) 3);
lfring_free(rb);
}
int main(void)
{
printf("testing MPMC lock-free ring\n");
test_ringbuffer(LFRING_FLAG_MP | LFRING_FLAG_MC);
printf("testing MPSC lock-free ring\n");
test_ringbuffer(LFRING_FLAG_MP | LFRING_FLAG_SC);
printf("testing SPMC lock-free ring\n");
test_ringbuffer(LFRING_FLAG_SP | LFRING_FLAG_MC);
printf("testing SPSC lock-free ring\n");
test_ringbuffer(LFRING_FLAG_SP | LFRING_FLAG_SC);
return 0;
}