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

#include <kernel.h>
#include <zephyr.h>

#include "footprint.h"

#define STACK_SIZE	512

K_MUTEX_DEFINE(user_mutex);

#ifdef CONFIG_USERSPACE
static void user_thread_fn(void *arg1, void *arg2, void *arg3)
{
	ARG_UNUSED(arg1);
	ARG_UNUSED(arg2);
	ARG_UNUSED(arg3);

	k_mutex_lock(&user_mutex, K_FOREVER);

	k_mutex_unlock(&user_mutex);
}

static void run_user_mutex(void)
{
	k_tid_t tid;

	/* Exercise simple workqueue */
	tid = k_thread_create(&my_thread, my_stack_area, STACK_SIZE,
			      user_thread_fn, NULL, NULL, NULL,
			      0, K_USER, K_FOREVER);
	k_object_access_grant(&user_mutex, tid);

	k_thread_start(tid);
	k_thread_join(tid, K_FOREVER);
}
#endif /* CONFIG_USERSPACE */

static void run_system_mutex(void)
{
	struct k_mutex sys_mutex;

	k_mutex_init(&sys_mutex);

	k_mutex_lock(&sys_mutex, K_FOREVER);

	k_mutex_unlock(&sys_mutex);
}

void run_mutex(void)
{
	run_system_mutex();

#ifdef CONFIG_USERSPACE
	run_user_mutex();
#endif
}
