From f2be0286e60307175f3ce52e7e33ee172c41e449 Mon Sep 17 00:00:00 2001 From: Lucio Rossi Date: Mon, 28 Jul 2025 16:54:24 +0200 Subject: [PATCH 1/4] mod: timeout MUXes + process mux --- src/bridge.h | 96 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 75 insertions(+), 21 deletions(-) diff --git a/src/bridge.h b/src/bridge.h index afc1d25..90d47b9 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -26,6 +26,7 @@ class BridgeClass { struct k_mutex read_mutex; struct k_mutex write_mutex; + struct k_mutex proc_mutex; k_tid_t upd_tid; k_thread_stack_t *upd_stack_area; @@ -44,6 +45,7 @@ class BridgeClass { k_mutex_init(&read_mutex); k_mutex_init(&write_mutex); + k_mutex_init(&proc_mutex); client = new RPCClient(*transport); server = new RPCServer(*transport); @@ -81,21 +83,41 @@ class BridgeClass { void update() { - k_msleep(1); // Lock read mutex - k_mutex_lock(&read_mutex, K_FOREVER); + if (k_mutex_lock(&read_mutex, K_MSEC(10)) != 0 ) return; + if (!server->get_rpc()) { k_mutex_unlock(&read_mutex); + k_msleep(1); return; } + k_mutex_unlock(&read_mutex); - server->process_request(); + while (true) { + if (k_mutex_lock(&proc_mutex, K_MSEC(10)) == 0){ + server->process_request(); + k_mutex_unlock(&proc_mutex); + k_msleep(1); + break; + } else { + k_msleep(1); + } + } // Lock write mutex - k_mutex_lock(&write_mutex, K_FOREVER); - server->send_response(); - k_mutex_unlock(&write_mutex); + while (true) { + + if (k_mutex_lock(&write_mutex, K_MSEC(10)) == 0){ + server->send_response(); + k_mutex_unlock(&write_mutex); + k_msleep(1); + break; + } else { + k_msleep(1); + } + + } } @@ -103,19 +125,31 @@ class BridgeClass { bool call(const MsgPack::str_t method, RType& result, Args&&... args) { // Lock write mutex - k_mutex_lock(&write_mutex, K_FOREVER); - client->send_rpc(method, std::forward(args)...); - k_mutex_unlock(&write_mutex); + while (true) { + if (k_mutex_lock(&write_mutex, K_MSEC(10)) == 0) { + client->send_rpc(method, std::forward(args)...); + k_mutex_unlock(&write_mutex); + k_msleep(1); + break; + } else { + k_msleep(1); + } + } // Lock read mutex - while(1) { - k_mutex_lock(&read_mutex, K_FOREVER); - if (client->get_response(result)) { + while(true) { + if (k_mutex_lock(&read_mutex, K_MSEC(10) == 0 )) { + if (client->get_response(result)) { + k_mutex_unlock(&read_mutex); + k_msleep(1); + break; + } k_mutex_unlock(&read_mutex); - break; + k_msleep(1); + } else { + k_msleep(1); } - k_mutex_unlock(&read_mutex); - k_msleep(1); + } return (client->lastError.code == NO_ERR); @@ -140,20 +174,40 @@ class BridgeClass { void update_safe() { // Lock read mutex - k_msleep(1); - k_mutex_lock(&read_mutex, K_FOREVER); + if (k_mutex_lock(&read_mutex, K_MSEC(10)) != 0 ) return; + if (!server->get_rpc()) { k_mutex_unlock(&read_mutex); + k_msleep(1); return; } + k_mutex_unlock(&read_mutex); - server->process_request("__safe__"); + while (true) { + if (k_mutex_lock(&proc_mutex, K_MSEC(10)) == 0){ + server->process_request("__safe__"); + k_mutex_unlock(&proc_mutex); + k_msleep(1); + break; + } else { + k_msleep(1); + } + } // Lock write mutex - k_mutex_lock(&write_mutex, K_FOREVER); - server->send_response(); - k_mutex_unlock(&write_mutex); + while (true) { + + if (k_mutex_lock(&write_mutex, K_MSEC(10)) == 0){ + server->send_response(); + k_mutex_unlock(&write_mutex); + k_msleep(1); + break; + } else { + k_msleep(1); + } + + } } From fa744bfaa6000a993b85dee8f844b07f04846394 Mon Sep 17 00:00:00 2001 From: Lucio Rossi Date: Mon, 28 Jul 2025 16:59:52 +0200 Subject: [PATCH 2/4] fix ... --- src/bridge.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bridge.h b/src/bridge.h index 90d47b9..f7963f4 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -138,7 +138,7 @@ class BridgeClass { // Lock read mutex while(true) { - if (k_mutex_lock(&read_mutex, K_MSEC(10) == 0 )) { + if (k_mutex_lock(&read_mutex, K_MSEC(10)) == 0 ) { if (client->get_response(result)) { k_mutex_unlock(&read_mutex); k_msleep(1); From 5f0df16f865e9169a9f521a9e7ea9b4e745dbd8f Mon Sep 17 00:00:00 2001 From: Lucio Rossi Date: Mon, 28 Jul 2025 18:07:49 +0200 Subject: [PATCH 3/4] fix: bridge updates getting stuck: threads miss yielding --- library.json | 2 +- library.properties | 2 +- src/bridge.h | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/library.json b/library.json index ce24b6d..f248494 100644 --- a/library.json +++ b/library.json @@ -11,7 +11,7 @@ "url": "https://github.com/bcmi-labs/Arduino_RouterBridge", "maintainer": true }, - "version": "0.1.0", + "version": "0.1.2", "license": "MIT", "frameworks": "arduino", "platforms": "*", diff --git a/library.properties b/library.properties index 9e0dfb5..1229434 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Arduino_RouterBridge -version=0.1.0 +version=0.1.2 author=BCMI-labs maintainer=BCMI-labs sentence=A RPC bridge for Arduino UNO Q boards diff --git a/src/bridge.h b/src/bridge.h index f7963f4..fa03906 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -230,6 +230,7 @@ BridgeClass Bridge(Serial1); void updateEntryPoint(void *, void *, void *){ while(1){ Bridge.update(); + k_msleep(1); } } @@ -238,6 +239,7 @@ static void safeUpdate(){ } void __loopHook(){ + k_msleep(1); safeUpdate(); } From 4a63d27a1823bbf4b08b56ee2ed3379c817dff08 Mon Sep 17 00:00:00 2001 From: Lucio Rossi Date: Tue, 29 Jul 2025 11:40:10 +0200 Subject: [PATCH 4/4] feat: server_mux and client_mux --- src/bridge.h | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/src/bridge.h b/src/bridge.h index fa03906..5bf57fe 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -26,7 +26,8 @@ class BridgeClass { struct k_mutex read_mutex; struct k_mutex write_mutex; - struct k_mutex proc_mutex; + struct k_mutex server_mutex; + struct k_mutex client_mutex; k_tid_t upd_tid; k_thread_stack_t *upd_stack_area; @@ -45,7 +46,8 @@ class BridgeClass { k_mutex_init(&read_mutex); k_mutex_init(&write_mutex); - k_mutex_init(&proc_mutex); + k_mutex_init(&server_mutex); + k_mutex_init(&client_mutex); client = new RPCClient(*transport); server = new RPCServer(*transport); @@ -83,6 +85,8 @@ class BridgeClass { void update() { + if (k_mutex_lock(&server_mutex, K_MSEC(10)) != 0) return; + // Lock read mutex if (k_mutex_lock(&read_mutex, K_MSEC(10)) != 0 ) return; @@ -94,16 +98,7 @@ class BridgeClass { k_mutex_unlock(&read_mutex); - while (true) { - if (k_mutex_lock(&proc_mutex, K_MSEC(10)) == 0){ - server->process_request(); - k_mutex_unlock(&proc_mutex); - k_msleep(1); - break; - } else { - k_msleep(1); - } - } + server->process_request(); // Lock write mutex while (true) { @@ -119,11 +114,15 @@ class BridgeClass { } + k_mutex_unlock(&server_mutex); + } template bool call(const MsgPack::str_t method, RType& result, Args&&... args) { + k_mutex_lock(&client_mutex, K_FOREVER); + // Lock write mutex while (true) { if (k_mutex_lock(&write_mutex, K_MSEC(10)) == 0) { @@ -154,6 +153,8 @@ class BridgeClass { return (client->lastError.code == NO_ERR); + k_mutex_unlock(&client_mutex); + } template @@ -173,6 +174,8 @@ class BridgeClass { void update_safe() { + if (k_mutex_lock(&server_mutex, K_MSEC(10)) != 0) return; + // Lock read mutex if (k_mutex_lock(&read_mutex, K_MSEC(10)) != 0 ) return; @@ -184,16 +187,7 @@ class BridgeClass { k_mutex_unlock(&read_mutex); - while (true) { - if (k_mutex_lock(&proc_mutex, K_MSEC(10)) == 0){ - server->process_request("__safe__"); - k_mutex_unlock(&proc_mutex); - k_msleep(1); - break; - } else { - k_msleep(1); - } - } + server->process_request("__safe__"); // Lock write mutex while (true) { @@ -209,6 +203,8 @@ class BridgeClass { } + k_mutex_unlock(&server_mutex); + } friend class BridgeClassUpdater;