Blame jemalloc/test/unit/seq.c

Packit Service 724aca
#include "test/jemalloc_test.h"
Packit Service 724aca
Packit Service 724aca
#include "jemalloc/internal/seq.h"
Packit Service 724aca
Packit Service 724aca
typedef struct data_s data_t;
Packit Service 724aca
struct data_s {
Packit Service 724aca
	int arr[10];
Packit Service 724aca
};
Packit Service 724aca
Packit Service 724aca
static void
Packit Service 724aca
set_data(data_t *data, int num) {
Packit Service 724aca
	for (int i = 0; i < 10; i++) {
Packit Service 724aca
		data->arr[i] = num;
Packit Service 724aca
	}
Packit Service 724aca
}
Packit Service 724aca
Packit Service 724aca
static void
Packit Service 724aca
assert_data(data_t *data) {
Packit Service 724aca
	int num = data->arr[0];
Packit Service 724aca
	for (int i = 0; i < 10; i++) {
Packit Service 724aca
		assert_d_eq(num, data->arr[i], "Data consistency error");
Packit Service 724aca
	}
Packit Service 724aca
}
Packit Service 724aca
Packit Service 724aca
seq_define(data_t, data)
Packit Service 724aca
Packit Service 724aca
typedef struct thd_data_s thd_data_t;
Packit Service 724aca
struct thd_data_s {
Packit Service 724aca
	seq_data_t data;
Packit Service 724aca
};
Packit Service 724aca
Packit Service 724aca
static void *
Packit Service 724aca
seq_reader_thd(void *arg) {
Packit Service 724aca
	thd_data_t *thd_data = (thd_data_t *)arg;
Packit Service 724aca
	int iter = 0;
Packit Service 724aca
	data_t local_data;
Packit Service 724aca
	while (iter < 1000 * 1000 - 1) {
Packit Service 724aca
		bool success = seq_try_load_data(&local_data, &thd_data->data);
Packit Service 724aca
		if (success) {
Packit Service 724aca
			assert_data(&local_data);
Packit Service 724aca
			assert_d_le(iter, local_data.arr[0],
Packit Service 724aca
			    "Seq read went back in time.");
Packit Service 724aca
			iter = local_data.arr[0];
Packit Service 724aca
		}
Packit Service 724aca
	}
Packit Service 724aca
	return NULL;
Packit Service 724aca
}
Packit Service 724aca
Packit Service 724aca
static void *
Packit Service 724aca
seq_writer_thd(void *arg) {
Packit Service 724aca
	thd_data_t *thd_data = (thd_data_t *)arg;
Packit Service 724aca
	data_t local_data;
Packit Service 724aca
	memset(&local_data, 0, sizeof(local_data));
Packit Service 724aca
	for (int i = 0; i < 1000 * 1000; i++) {
Packit Service 724aca
		set_data(&local_data, i);
Packit Service 724aca
		seq_store_data(&thd_data->data, &local_data);
Packit Service 724aca
	}
Packit Service 724aca
	return NULL;
Packit Service 724aca
}
Packit Service 724aca
Packit Service 724aca
TEST_BEGIN(test_seq_threaded) {
Packit Service 724aca
	thd_data_t thd_data;
Packit Service 724aca
	memset(&thd_data, 0, sizeof(thd_data));
Packit Service 724aca
Packit Service 724aca
	thd_t reader;
Packit Service 724aca
	thd_t writer;
Packit Service 724aca
Packit Service 724aca
	thd_create(&reader, seq_reader_thd, &thd_data);
Packit Service 724aca
	thd_create(&writer, seq_writer_thd, &thd_data);
Packit Service 724aca
Packit Service 724aca
	thd_join(reader, NULL);
Packit Service 724aca
	thd_join(writer, NULL);
Packit Service 724aca
}
Packit Service 724aca
TEST_END
Packit Service 724aca
Packit Service 724aca
TEST_BEGIN(test_seq_simple) {
Packit Service 724aca
	data_t data;
Packit Service 724aca
	seq_data_t seq;
Packit Service 724aca
	memset(&seq, 0, sizeof(seq));
Packit Service 724aca
	for (int i = 0; i < 1000 * 1000; i++) {
Packit Service 724aca
		set_data(&data, i);
Packit Service 724aca
		seq_store_data(&seq, &data);
Packit Service 724aca
		set_data(&data, 0);
Packit Service 724aca
		bool success = seq_try_load_data(&data, &seq;;
Packit Service 724aca
		assert_b_eq(success, true, "Failed non-racing read");
Packit Service 724aca
		assert_data(&data);
Packit Service 724aca
	}
Packit Service 724aca
}
Packit Service 724aca
TEST_END
Packit Service 724aca
Packit Service 724aca
int main(void) {
Packit Service 724aca
	return test_no_reentrancy(
Packit Service 724aca
	    test_seq_simple,
Packit Service 724aca
	    test_seq_threaded);
Packit Service 724aca
}