105 lines
2.3 KiB
C
105 lines
2.3 KiB
C
|
/*
|
||
|
* Copyright (c) 2019 Intel Corporation
|
||
|
*
|
||
|
* SPDX-License-Identifier: Apache-2.0
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @file
|
||
|
*
|
||
|
* @brief public sys_sem APIs.
|
||
|
*/
|
||
|
|
||
|
#ifndef ZEPHYR_INCLUDE_SYS_SEM_H_
|
||
|
#define ZEPHYR_INCLUDE_SYS_SEM_H_
|
||
|
|
||
|
/*
|
||
|
* sys_sem exists in user memory working as counter semaphore for
|
||
|
* user mode thread when user mode enabled. When user mode isn't
|
||
|
* enabled, sys_sem behaves like k_sem.
|
||
|
*/
|
||
|
|
||
|
#include <kernel.h>
|
||
|
#include <atomic.h>
|
||
|
#include <zephyr/types.h>
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
* sys_sem structure
|
||
|
*/
|
||
|
struct sys_sem {
|
||
|
#ifdef CONFIG_USERSPACE
|
||
|
struct k_futex futex;
|
||
|
int limit;
|
||
|
#else
|
||
|
struct k_sem kernel_sem;
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief Initialize a semaphore.
|
||
|
*
|
||
|
* This routine initializes a semaphore instance, prior to its first use.
|
||
|
*
|
||
|
* @param sem Address of the semaphore.
|
||
|
* @param initial_count Initial semaphore count.
|
||
|
* @param limit Maximum permitted semaphore count.
|
||
|
*
|
||
|
* @retval 0 Initial success.
|
||
|
* @retval -EINVAL Bad parameters, the value of limit should be located in
|
||
|
* (0, INT_MAX] and initial_count shouldn't be greater than limit.
|
||
|
*/
|
||
|
int sys_sem_init(struct sys_sem *sem, unsigned int initial_count,
|
||
|
unsigned int limit);
|
||
|
|
||
|
/**
|
||
|
* @brief Give a semaphore.
|
||
|
*
|
||
|
* This routine gives @a sem, unless the semaphore is already at its
|
||
|
* maximum permitted count.
|
||
|
*
|
||
|
* @param sem Address of the semaphore.
|
||
|
*
|
||
|
* @retval 0 Semaphore given.
|
||
|
* @retval -EINVAL Parameter address not recognized.
|
||
|
* @retval -EACCES Caller does not have enough access.
|
||
|
* @retval -EAGAIN Count reached Maximum permitted count and try again.
|
||
|
*/
|
||
|
int sys_sem_give(struct sys_sem *sem);
|
||
|
|
||
|
/**
|
||
|
* @brief Take a sys_sem.
|
||
|
*
|
||
|
* This routine takes @a sem.
|
||
|
*
|
||
|
* @param sem Address of the sys_sem.
|
||
|
* @param timeout Waiting period to take the sys_sem (in milliseconds),
|
||
|
* or one of the special values K_NO_WAIT and K_FOREVER.
|
||
|
*
|
||
|
* @retval 0 sys_sem taken.
|
||
|
* @retval -EINVAL Parameter address not recognized.
|
||
|
* @retval -ETIMEDOUT Waiting period timed out.
|
||
|
* @retval -EACCES Caller does not have enough access.
|
||
|
*/
|
||
|
int sys_sem_take(struct sys_sem *sem, s32_t timeout);
|
||
|
|
||
|
/**
|
||
|
* @brief Get sys_sem's value
|
||
|
*
|
||
|
* This routine returns the current value of @a sem.
|
||
|
*
|
||
|
* @param sem Address of the sys_sem.
|
||
|
*
|
||
|
* @return Current value of sys_sem.
|
||
|
*/
|
||
|
unsigned int sys_sem_count_get(struct sys_sem *sem);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif
|