/*
 * Copyright (c) 2021 Synopsys.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifdef CONFIG_MULTITHREADING

#include <zephyr/init.h>
#include <zephyr/kernel.h>
#include <zephyr/sys/__assert.h>
#include <zephyr/sys/mutex.h>
#include <zephyr/logging/log.h>
#include <../lib/src/c/inc/internal/thread.h>

#ifndef CONFIG_USERSPACE
#define ARCMWDT_DYN_LOCK_SZ	(sizeof(struct k_mutex))
#define ARCMWDT_MAX_DYN_LOCKS	10

K_MEM_SLAB_DEFINE(z_arcmwdt_lock_slab, ARCMWDT_DYN_LOCK_SZ, ARCMWDT_MAX_DYN_LOCKS, sizeof(void *));
#endif /* !CONFIG_USERSPACE */

LOG_MODULE_DECLARE(os, CONFIG_KERNEL_LOG_LEVEL);

void _mwmutex_create(_lock_t *mutex_ptr)
{
	bool alloc_fail;
#ifdef CONFIG_USERSPACE
	*mutex_ptr = k_object_alloc(K_OBJ_MUTEX);
	alloc_fail = (*mutex_ptr == NULL);
#else
	alloc_fail = !!k_mem_slab_alloc(&z_arcmwdt_lock_slab, mutex_ptr, K_NO_WAIT);
#endif /* CONFIG_USERSPACE */

	if (alloc_fail) {
		LOG_ERR("MWDT lock allocation failed");
		k_panic();
	}

	k_mutex_init((struct k_mutex *)*mutex_ptr);
}

void _mwmutex_delete(_lock_t *mutex_ptr)
{
	__ASSERT_NO_MSG(mutex_ptr != NULL);
#ifdef CONFIG_USERSPACE
	k_object_release(mutex_ptr);
#else
	k_mem_slab_free(&z_arcmwdt_lock_slab, *mutex_ptr);
#endif /* CONFIG_USERSPACE */
}

void _mwmutex_lock(_lock_t mutex)
{
	__ASSERT_NO_MSG(mutex != NULL);
	k_mutex_lock((struct k_mutex *)mutex, K_FOREVER);
}

void _mwmutex_unlock(_lock_t mutex)
{
	__ASSERT_NO_MSG(mutex != NULL);
	k_mutex_unlock((struct k_mutex *)mutex);
}
#endif /* CONFIG_MULTITHREADING */
