diff --git a/kal/posix/src/semaphore.c b/kal/posix/src/semaphore.c index 349a8fe9..87686681 100644 --- a/kal/posix/src/semaphore.c +++ b/kal/posix/src/semaphore.c @@ -186,3 +186,21 @@ int sem_timedwait(sem_t *sem, const struct timespec *timeout) return 0; } + +int sem_getvalue(sem_t *sem, int *currVal) +{ + UINT32 ret; + + if ((sem == NULL) || (currVal == NULL)) { + errno = EINVAL; + return -1; + } + + ret = LOS_SemGetValue(sem->s_handle, currVal); + if (ret) { + errno = EINVAL; + return -1; + } + + return LOS_OK; +} \ No newline at end of file diff --git a/kernel/include/los_sem.h b/kernel/include/los_sem.h index 49fbb816..cd403682 100644 --- a/kernel/include/los_sem.h +++ b/kernel/include/los_sem.h @@ -285,6 +285,8 @@ extern UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout); */ extern UINT32 LOS_SemPost(UINT32 semHandle); +extern UINT32 LOS_SemGetValue(UINT32 semHandle, INT32 *currVal); + /** * @ingroup los_sem * Semaphore control structure. diff --git a/kernel/src/los_sem.c b/kernel/src/los_sem.c index fdf8f52d..685256ce 100644 --- a/kernel/src/los_sem.c +++ b/kernel/src/los_sem.c @@ -312,4 +312,16 @@ LITE_OS_SEC_TEXT UINT32 LOS_SemPost(UINT32 semHandle) return LOS_OK; } +LITE_OS_SEC_TEXT UINT32 LOS_SemGetValue(UINT32 semHandle, INT32 *currVal) +{ + LosSemCB *sem = GET_SEM(semHandle); + + if (semHandle >= (UINT32)LOSCFG_BASE_IPC_SEM_LIMIT) { + OS_RETURN_ERROR(LOS_ERRNO_SEM_INVALID); + } + + *currVal = sem->semCount; + return 0; +} + #endif /* (LOSCFG_BASE_IPC_SEM == 1) */