summaryrefslogtreecommitdiff
path: root/src/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/ao.h3
-rw-r--r--src/kernel/ao_mutex.c23
2 files changed, 26 insertions, 0 deletions
diff --git a/src/kernel/ao.h b/src/kernel/ao.h
index c11aa028..a225bc4a 100644
--- a/src/kernel/ao.h
+++ b/src/kernel/ao.h
@@ -132,6 +132,9 @@ ao_clock_init(void);
*/
#ifndef ao_mutex_get
+uint8_t
+ao_mutex_try(__xdata uint8_t *ao_mutex, uint8_t task_id) __reentrant;
+
void
ao_mutex_get(__xdata uint8_t *ao_mutex) __reentrant;
diff --git a/src/kernel/ao_mutex.c b/src/kernel/ao_mutex.c
index 952ff462..a36fe939 100644
--- a/src/kernel/ao_mutex.c
+++ b/src/kernel/ao_mutex.c
@@ -17,6 +17,29 @@
#include "ao.h"
+#ifndef HAS_MUTEX_TRY
+#define HAS_MUTEX_TRY 1
+#endif
+
+#if HAS_MUTEX_TRY
+
+uint8_t
+ao_mutex_try(__xdata uint8_t *mutex, uint8_t task_id) __reentrant
+{
+ uint8_t ret;
+ if (*mutex == task_id)
+ ao_panic(AO_PANIC_MUTEX);
+ ao_arch_critical(
+ if (*mutex)
+ ret = 0;
+ else {
+ *mutex = task_id;
+ ret = 1;
+ });
+ return ret;
+}
+#endif
+
void
ao_mutex_get(__xdata uint8_t *mutex) __reentrant
{