// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2020 Facebook */
#include "bench.h"

/* COUNT-GLOBAL benchmark */

static struct count_global_ctx {
	struct counter hits;
} count_global_ctx;

static void *count_global_producer(void *input)
{
	struct count_global_ctx *ctx = &count_global_ctx;

	while (true) {
		atomic_inc(&ctx->hits.value);
	}
	return NULL;
}

static void *count_global_consumer(void *input)
{
	return NULL;
}

static void count_global_measure(struct bench_res *res)
{
	struct count_global_ctx *ctx = &count_global_ctx;

	res->hits = atomic_swap(&ctx->hits.value, 0);
}

/* COUNT-local benchmark */

static struct count_local_ctx {
	struct counter *hits;
} count_local_ctx;

static void count_local_setup(void)
{
	struct count_local_ctx *ctx = &count_local_ctx;

	ctx->hits = calloc(env.consumer_cnt, sizeof(*ctx->hits));
	if (!ctx->hits)
		exit(1);
}

static void *count_local_producer(void *input)
{
	struct count_local_ctx *ctx = &count_local_ctx;
	int idx = (long)input;

	while (true) {
		atomic_inc(&ctx->hits[idx].value);
	}
	return NULL;
}

static void *count_local_consumer(void *input)
{
	return NULL;
}

static void count_local_measure(struct bench_res *res)
{
	struct count_local_ctx *ctx = &count_local_ctx;
	int i;

	for (i = 0; i < env.producer_cnt; i++) {
		res->hits += atomic_swap(&ctx->hits[i].value, 0);
	}
}

const struct bench bench_count_global = {
	.name = "count-global",
	.producer_thread = count_global_producer,
	.consumer_thread = count_global_consumer,
	.measure = count_global_measure,
	.report_progress = hits_drops_report_progress,
	.report_final = hits_drops_report_final,
};

const struct bench bench_count_local = {
	.name = "count-local",
	.setup = count_local_setup,
	.producer_thread = count_local_producer,
	.consumer_thread = count_local_consumer,
	.measure = count_local_measure,
	.report_progress = hits_drops_report_progress,
	.report_final = hits_drops_report_final,
};
