From 1942641ff66dca2d1c458f4bc27b217700851ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Thu, 18 May 2017 11:58:35 +0200 Subject: [PATCH] semaphore: add px4_sem_trywait directly mapped to the posix method sem_trywait --- src/platforms/posix/px4_layer/px4_sem.cpp | 21 +++++++++++++++++++++ src/platforms/px4_sem.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/src/platforms/posix/px4_layer/px4_sem.cpp b/src/platforms/posix/px4_layer/px4_sem.cpp index e09e6ccc7a..59bac76bd9 100644 --- a/src/platforms/posix/px4_layer/px4_sem.cpp +++ b/src/platforms/posix/px4_layer/px4_sem.cpp @@ -91,6 +91,27 @@ int px4_sem_wait(px4_sem_t *s) return (ret) ? ret : mret; } +int px4_sem_trywait(px4_sem_t *s) +{ + int ret = pthread_mutex_lock(&(s->lock)); + + if (ret) { + return ret; + } + + if (s->value <= 0) { + errno = EAGAIN; + ret = -1; + + } else { + s->value--; + } + + int mret = pthread_mutex_unlock(&(s->lock)); + + return (ret) ? ret : mret; +} + int px4_sem_timedwait(px4_sem_t *s, const struct timespec *abstime) { int ret = pthread_mutex_lock(&(s->lock)); diff --git a/src/platforms/px4_sem.h b/src/platforms/px4_sem.h index c880e88c89..d6d467f61b 100644 --- a/src/platforms/px4_sem.h +++ b/src/platforms/px4_sem.h @@ -63,6 +63,7 @@ typedef struct { __EXPORT int px4_sem_init(px4_sem_t *s, int pshared, unsigned value); __EXPORT int px4_sem_setprotocol(px4_sem_t *s, int protocol); __EXPORT int px4_sem_wait(px4_sem_t *s); +__EXPORT int px4_sem_trywait(px4_sem_t *sem); __EXPORT int px4_sem_timedwait(px4_sem_t *sem, const struct timespec *abstime); __EXPORT int px4_sem_post(px4_sem_t *s); __EXPORT int px4_sem_getvalue(px4_sem_t *s, int *sval); @@ -79,6 +80,7 @@ typedef sem_t px4_sem_t; #define px4_sem_init sem_init #define px4_sem_setprotocol sem_setprotocol #define px4_sem_wait sem_wait +#define px4_sem_trywait sem_trywait #define px4_sem_post sem_post #define px4_sem_getvalue sem_getvalue #define px4_sem_destroy sem_destroy