/* memslab.c */

/*
 * Copyright (c) 2020, Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "syskernel.h"

#define MEM_SLAB_BLOCK_SIZE  (8)
#define MEM_SLAB_BLOCK_CNT   (NUMBER_OF_LOOPS)
#define MEM_SLAB_BLOCK_ALIGN (4)

K_MEM_SLAB_DEFINE_STATIC(my_slab,
		  MEM_SLAB_BLOCK_SIZE,
		  MEM_SLAB_BLOCK_CNT,
		  MEM_SLAB_BLOCK_ALIGN);

/* Array contains pointers to allocated regions. */
static void *slab_array[MEM_SLAB_BLOCK_CNT];

/**
 *
 * @brief Memslab allocation test function.
 *		  This test allocates available memory space.
 *
 * @param no_of_loops  Amount of loops to run.
 * @param test_repeats Amount of test repeats per loop.
 *
 * @return NUmber of done loops.
 */
static int mem_slab_alloc_test(int no_of_loops)
{
	int i;

	for (i = 0; i < no_of_loops; i++) {
		if (k_mem_slab_alloc(&my_slab, &slab_array[i], K_NO_WAIT)
		    != 0) {
			return i;
		}
	}

	return i;
}

/**
 *
 * @brief Memslab free test function.
 *		  This test frees memory previously allocated in
 *		  @ref mem_slab_alloc_test.
 *
 * @param no_of_loops  Amount of loops to run.
 * @param test_repeats Amount of test repeats per loop.
 *
 * @return NUmber of done loops.
 */
static int mem_slab_free_test(int no_of_loops)
{
	int i;

	for (i = 0; i < no_of_loops; i++) {
		k_mem_slab_free(&my_slab, &slab_array[i]);
	}

	return i;
}

int mem_slab_test(void)
{
	uint32_t t;
	int i = 0;
	int return_value = 0;

	/* Test k_mem_slab_alloc. */
	fprintf(output_file, sz_test_case_fmt,
		"Memslab #1");
	fprintf(output_file, sz_description,
		"\n\tk_mem_slab_alloc");
	printf(sz_test_start_fmt);

	t = BENCH_START();
	i = mem_slab_alloc_test(number_of_loops);
	t = TIME_STAMP_DELTA_GET(t);

	return_value += check_result(i, t);

	/* Test k_mem_slab_free. */
	fprintf(output_file, sz_test_case_fmt,
		"Memslab #2");
	fprintf(output_file, sz_description,
		"\n\tk_mem_slab_free");
	printf(sz_test_start_fmt);

	t = BENCH_START();
	i = mem_slab_free_test(number_of_loops);
	t = TIME_STAMP_DELTA_GET(t);

	/* Check if all slabs were freed. */
	if (k_mem_slab_num_used_get(&my_slab) != 0) {
		i = 0;
	}

	return_value += check_result(i, t);

	return return_value;
}
