1 #include "test/jemalloc_test.h"
2 
3 #include "jemalloc/internal/seq.h"
4 
5 typedef struct data_s data_t;
6 struct data_s {
7 	int arr[10];
8 };
9 
10 static void
set_data(data_t * data,int num)11 set_data(data_t *data, int num) {
12 	for (int i = 0; i < 10; i++) {
13 		data->arr[i] = num;
14 	}
15 }
16 
17 static void
assert_data(data_t * data)18 assert_data(data_t *data) {
19 	int num = data->arr[0];
20 	for (int i = 0; i < 10; i++) {
21 		assert_d_eq(num, data->arr[i], "Data consistency error");
22 	}
23 }
24 
25 seq_define(data_t, data)
26 
27 typedef struct thd_data_s thd_data_t;
28 struct thd_data_s {
29 	seq_data_t data;
30 };
31 
32 static void *
seq_reader_thd(void * arg)33 seq_reader_thd(void *arg) {
34 	thd_data_t *thd_data = (thd_data_t *)arg;
35 	int iter = 0;
36 	data_t local_data;
37 	while (iter < 1000 * 1000 - 1) {
38 		bool success = seq_try_load_data(&local_data, &thd_data->data);
39 		if (success) {
40 			assert_data(&local_data);
41 			assert_d_le(iter, local_data.arr[0],
42 			    "Seq read went back in time.");
43 			iter = local_data.arr[0];
44 		}
45 	}
46 	return NULL;
47 }
48 
49 static void *
seq_writer_thd(void * arg)50 seq_writer_thd(void *arg) {
51 	thd_data_t *thd_data = (thd_data_t *)arg;
52 	data_t local_data;
53 	memset(&local_data, 0, sizeof(local_data));
54 	for (int i = 0; i < 1000 * 1000; i++) {
55 		set_data(&local_data, i);
56 		seq_store_data(&thd_data->data, &local_data);
57 	}
58 	return NULL;
59 }
60 
TEST_BEGIN(test_seq_threaded)61 TEST_BEGIN(test_seq_threaded) {
62 	thd_data_t thd_data;
63 	memset(&thd_data, 0, sizeof(thd_data));
64 
65 	thd_t reader;
66 	thd_t writer;
67 
68 	thd_create(&reader, seq_reader_thd, &thd_data);
69 	thd_create(&writer, seq_writer_thd, &thd_data);
70 
71 	thd_join(reader, NULL);
72 	thd_join(writer, NULL);
73 }
74 TEST_END
75 
TEST_BEGIN(test_seq_simple)76 TEST_BEGIN(test_seq_simple) {
77 	data_t data;
78 	seq_data_t seq;
79 	memset(&seq, 0, sizeof(seq));
80 	for (int i = 0; i < 1000 * 1000; i++) {
81 		set_data(&data, i);
82 		seq_store_data(&seq, &data);
83 		set_data(&data, 0);
84 		bool success = seq_try_load_data(&data, &seq);
85 		assert_b_eq(success, true, "Failed non-racing read");
86 		assert_data(&data);
87 	}
88 }
89 TEST_END
90 
main(void)91 int main(void) {
92 	return test_no_reentrancy(
93 	    test_seq_simple,
94 	    test_seq_threaded);
95 }
96