/*
 * Copyright (c) 2021 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

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

#define TEST_COUNT 100
#define TEST_SIZE 10

void heap_malloc_free(void)
{
	timing_t heap_malloc_start_time = 0U;
	timing_t heap_malloc_end_time = 0U;

	timing_t heap_free_start_time = 0U;
	timing_t heap_free_end_time = 0U;

	uint32_t count = 0U;
	uint32_t sum_malloc = 0U;
	uint32_t sum_free = 0U;

	bool  failed = false;
	char  error_string[80];
	const char *notes = "";

	timing_start();

	while (count != TEST_COUNT) {
		heap_malloc_start_time = timing_counter_get();
		void *allocated_mem = k_malloc(TEST_SIZE);

		heap_malloc_end_time = timing_counter_get();
		if (allocated_mem == NULL) {
			error_count++;
			snprintk(error_string, 78,
				  "alloc memory @ iteration %d", count);
			notes = error_string;
			break;
		}

		heap_free_start_time = timing_counter_get();
		k_free(allocated_mem);
		heap_free_end_time = timing_counter_get();

		sum_malloc += timing_cycles_get(&heap_malloc_start_time,
				&heap_malloc_end_time);
		sum_free += timing_cycles_get(&heap_free_start_time,
				&heap_free_end_time);
		count++;
	}

	/*
	 * If count is 0, it means that there is not enough memory heap
	 * to do k_malloc at least once. Override the error string.
	 */

	if (count == 0) {
		failed = true;
		notes = "Memory heap too small--increase it.";
	}

	PRINT_STATS_AVG("Average time for heap malloc", sum_malloc, count,
			failed, notes);
	PRINT_STATS_AVG("Average time for heap free", sum_free, count,
			failed, notes);

	timing_stop();
}
