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