/*
 * Copyright (c) 2012-2015 Wind River Systems, Inc.
 * Copyright (c) 2020 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/kernel.h>
#include <zephyr/timing/timing.h>
#include "utils.h"

/* the number of mutex lock/unlock cycles */
#define N_TEST_MUTEX 1000

K_MUTEX_DEFINE(test_mutex);


/**
 *
 * @brief Test for the multiple mutex lock/unlock time
 *
 * The routine performs multiple mutex locks and then multiple mutex
 * unlocks to measure the necessary time.
 *
 * @return 0 on success
 */
int mutex_lock_unlock(void)
{
	int i;
	uint32_t diff;
	timing_t timestamp_start;
	timing_t timestamp_end;
	const char *notes = "";
	int  end;

	timing_start();
	bench_test_start();

	timestamp_start = timing_counter_get();

	for (i = 0; i < N_TEST_MUTEX; i++) {
		k_mutex_lock(&test_mutex, K_FOREVER);
	}

	timestamp_end = timing_counter_get();
	end = bench_test_end();

	diff = timing_cycles_get(&timestamp_start, &timestamp_end);

	if (end != 0) {
		notes = TICK_OCCURRENCE_ERROR;
		error_count++;
	}

	PRINT_STATS_AVG("Average time to lock a mutex", diff, N_TEST_MUTEX,
			false, notes);

	bench_test_start();
	timestamp_start = timing_counter_get();

	for (i = 0; i < N_TEST_MUTEX; i++) {
		k_mutex_unlock(&test_mutex);
	}

	timestamp_end = timing_counter_get();
	end = bench_test_end();
	diff = timing_cycles_get(&timestamp_start, &timestamp_end);

	if (end != 0) {
		notes = TICK_OCCURRENCE_ERROR;
		error_count++;
	}

	PRINT_STATS_AVG("Average time to unlock a mutex", diff, N_TEST_MUTEX,
			false, notes);

	timing_stop();
	return 0;
}
