From d06ebe16ced776a5f71188d07ff4028452910486 Mon Sep 17 00:00:00 2001
From: graham sanderson <graham.sanderson@raspberrypi.com>
Date: Mon, 20 Jun 2022 12:21:25 -0500
Subject: [PATCH] fix auto_init_recursive_mutex in c++

---
 src/common/pico_sync/include/pico/mutex.h | 4 ++++
 test/kitchen_sink/kitchen_sink.c          | 9 +++++++++
 2 files changed, 13 insertions(+)

diff --git a/src/common/pico_sync/include/pico/mutex.h b/src/common/pico_sync/include/pico/mutex.h
index e834dc5..4f61ce2 100644
--- a/src/common/pico_sync/include/pico/mutex.h
+++ b/src/common/pico_sync/include/pico/mutex.h
@@ -289,7 +289,11 @@ static inline bool recursive_mutex_is_initialized(recursive_mutex_t *mtx) {
  *
  * But the initialization of the mutex is performed automatically during runtime initialization
  */
+#ifdef __cplusplus
+#define auto_init_recursive_mutex(name) static __attribute__((section(".mutex_array"))) recursive_mutex_t name = { (spin_lock_t *)1 };
+#else
 #define auto_init_recursive_mutex(name) static __attribute__((section(".mutex_array"))) recursive_mutex_t name = { .core.spin_lock = (spin_lock_t *)1 /* marker for runtime_init */ }
+#endif
 
 #ifdef __cplusplus
 }
diff --git a/test/kitchen_sink/kitchen_sink.c b/test/kitchen_sink/kitchen_sink.c
index f61ece3..e007ce9 100644
--- a/test/kitchen_sink/kitchen_sink.c
+++ b/test/kitchen_sink/kitchen_sink.c
@@ -110,6 +110,9 @@ __force_inline int something_inlined(int x) {
     return x * 2;
 }
 
+auto_init_mutex(mutex);
+auto_init_recursive_mutex(recursive_mutex);
+
 int main(void) {
     spiggle();
 
@@ -118,6 +121,12 @@ int main(void) {
     printf("HI %d\n", something_inlined((int)time_us_32()));
     puts("Hello Everything!");
     puts("Hello Everything2!");
+
+    assert(mutex_try_enter(&mutex, NULL));
+    assert(!mutex_try_enter(&mutex, NULL));
+    assert(recursive_mutex_try_enter(&recursive_mutex, NULL));
+    assert(recursive_mutex_try_enter(&recursive_mutex, NULL));
     // this should compile as we are Cortex M0+
     __asm volatile("SVC #3");
+
 }
-- 
GitLab