Home | History | Annotate | Line # | Download | only in unit
      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