Skip to content

Commit 3394b38

Browse files
authored
Merge pull request #5 from bcmi-labs/better_mux
Better mux
2 parents 36cc03a + 4a63d27 commit 3394b38

File tree

3 files changed

+73
-21
lines changed

3 files changed

+73
-21
lines changed

library.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"url": "https://github.com/bcmi-labs/Arduino_RouterBridge",
1212
"maintainer": true
1313
},
14-
"version": "0.1.0",
14+
"version": "0.1.2",
1515
"license": "MIT",
1616
"frameworks": "arduino",
1717
"platforms": "*",

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=Arduino_RouterBridge
2-
version=0.1.0
2+
version=0.1.2
33
author=BCMI-labs
44
maintainer=BCMI-labs
55
sentence=A RPC bridge for Arduino UNO Q boards

src/bridge.h

Lines changed: 71 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ class BridgeClass {
2626

2727
struct k_mutex read_mutex;
2828
struct k_mutex write_mutex;
29+
struct k_mutex server_mutex;
30+
struct k_mutex client_mutex;
2931

3032
k_tid_t upd_tid;
3133
k_thread_stack_t *upd_stack_area;
@@ -44,6 +46,8 @@ class BridgeClass {
4446

4547
k_mutex_init(&read_mutex);
4648
k_mutex_init(&write_mutex);
49+
k_mutex_init(&server_mutex);
50+
k_mutex_init(&client_mutex);
4751

4852
client = new RPCClient(*transport);
4953
server = new RPCServer(*transport);
@@ -81,45 +85,76 @@ class BridgeClass {
8185

8286
void update() {
8387

84-
k_msleep(1);
88+
if (k_mutex_lock(&server_mutex, K_MSEC(10)) != 0) return;
89+
8590
// Lock read mutex
86-
k_mutex_lock(&read_mutex, K_FOREVER);
91+
if (k_mutex_lock(&read_mutex, K_MSEC(10)) != 0 ) return;
92+
8793
if (!server->get_rpc()) {
8894
k_mutex_unlock(&read_mutex);
95+
k_msleep(1);
8996
return;
9097
}
98+
9199
k_mutex_unlock(&read_mutex);
92100

93101
server->process_request();
94102

95103
// Lock write mutex
96-
k_mutex_lock(&write_mutex, K_FOREVER);
97-
server->send_response();
98-
k_mutex_unlock(&write_mutex);
104+
while (true) {
105+
106+
if (k_mutex_lock(&write_mutex, K_MSEC(10)) == 0){
107+
server->send_response();
108+
k_mutex_unlock(&write_mutex);
109+
k_msleep(1);
110+
break;
111+
} else {
112+
k_msleep(1);
113+
}
114+
115+
}
116+
117+
k_mutex_unlock(&server_mutex);
99118

100119
}
101120

102121
template<typename RType, typename... Args>
103122
bool call(const MsgPack::str_t method, RType& result, Args&&... args) {
104123

124+
k_mutex_lock(&client_mutex, K_FOREVER);
125+
105126
// Lock write mutex
106-
k_mutex_lock(&write_mutex, K_FOREVER);
107-
client->send_rpc(method, std::forward<Args>(args)...);
108-
k_mutex_unlock(&write_mutex);
127+
while (true) {
128+
if (k_mutex_lock(&write_mutex, K_MSEC(10)) == 0) {
129+
client->send_rpc(method, std::forward<Args>(args)...);
130+
k_mutex_unlock(&write_mutex);
131+
k_msleep(1);
132+
break;
133+
} else {
134+
k_msleep(1);
135+
}
136+
}
109137

110138
// Lock read mutex
111-
while(1) {
112-
k_mutex_lock(&read_mutex, K_FOREVER);
113-
if (client->get_response(result)) {
139+
while(true) {
140+
if (k_mutex_lock(&read_mutex, K_MSEC(10)) == 0 ) {
141+
if (client->get_response(result)) {
142+
k_mutex_unlock(&read_mutex);
143+
k_msleep(1);
144+
break;
145+
}
114146
k_mutex_unlock(&read_mutex);
115-
break;
147+
k_msleep(1);
148+
} else {
149+
k_msleep(1);
116150
}
117-
k_mutex_unlock(&read_mutex);
118-
k_msleep(1);
151+
119152
}
120153

121154
return (client->lastError.code == NO_ERR);
122155

156+
k_mutex_unlock(&client_mutex);
157+
123158
}
124159

125160
template<typename... Args>
@@ -139,22 +174,37 @@ class BridgeClass {
139174

140175
void update_safe() {
141176

177+
if (k_mutex_lock(&server_mutex, K_MSEC(10)) != 0) return;
178+
142179
// Lock read mutex
143-
k_msleep(1);
144-
k_mutex_lock(&read_mutex, K_FOREVER);
180+
if (k_mutex_lock(&read_mutex, K_MSEC(10)) != 0 ) return;
181+
145182
if (!server->get_rpc()) {
146183
k_mutex_unlock(&read_mutex);
184+
k_msleep(1);
147185
return;
148186
}
187+
149188
k_mutex_unlock(&read_mutex);
150189

151190
server->process_request("__safe__");
152191

153192
// Lock write mutex
154-
k_mutex_lock(&write_mutex, K_FOREVER);
155-
server->send_response();
156-
k_mutex_unlock(&write_mutex);
193+
while (true) {
194+
195+
if (k_mutex_lock(&write_mutex, K_MSEC(10)) == 0){
196+
server->send_response();
197+
k_mutex_unlock(&write_mutex);
198+
k_msleep(1);
199+
break;
200+
} else {
201+
k_msleep(1);
202+
}
157203

204+
}
205+
206+
k_mutex_unlock(&server_mutex);
207+
158208
}
159209

160210
friend class BridgeClassUpdater;
@@ -180,6 +230,7 @@ void updateEntryPoint(void *, void *, void *){
180230

181231
while(1){
182232
Bridge.update();
233+
k_msleep(1);
183234
}
184235
}
185236

@@ -188,6 +239,7 @@ static void safeUpdate(){
188239
}
189240

190241
void __loopHook(){
242+
k_msleep(1);
191243
safeUpdate();
192244
}
193245

0 commit comments

Comments
 (0)