Skip to content

Commit f2be028

Browse files
committed
mod: timeout MUXes + process mux
1 parent 63d1bf0 commit f2be028

File tree

1 file changed

+75
-21
lines changed

1 file changed

+75
-21
lines changed

src/bridge.h

Lines changed: 75 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class BridgeClass {
2626

2727
struct k_mutex read_mutex;
2828
struct k_mutex write_mutex;
29+
struct k_mutex proc_mutex;
2930

3031
k_tid_t upd_tid;
3132
k_thread_stack_t *upd_stack_area;
@@ -44,6 +45,7 @@ class BridgeClass {
4445

4546
k_mutex_init(&read_mutex);
4647
k_mutex_init(&write_mutex);
48+
k_mutex_init(&proc_mutex);
4749

4850
client = new RPCClient(*transport);
4951
server = new RPCServer(*transport);
@@ -81,41 +83,73 @@ class BridgeClass {
8183

8284
void update() {
8385

84-
k_msleep(1);
8586
// Lock read mutex
86-
k_mutex_lock(&read_mutex, K_FOREVER);
87+
if (k_mutex_lock(&read_mutex, K_MSEC(10)) != 0 ) return;
88+
8789
if (!server->get_rpc()) {
8890
k_mutex_unlock(&read_mutex);
91+
k_msleep(1);
8992
return;
9093
}
94+
9195
k_mutex_unlock(&read_mutex);
9296

93-
server->process_request();
97+
while (true) {
98+
if (k_mutex_lock(&proc_mutex, K_MSEC(10)) == 0){
99+
server->process_request();
100+
k_mutex_unlock(&proc_mutex);
101+
k_msleep(1);
102+
break;
103+
} else {
104+
k_msleep(1);
105+
}
106+
}
94107

95108
// Lock write mutex
96-
k_mutex_lock(&write_mutex, K_FOREVER);
97-
server->send_response();
98-
k_mutex_unlock(&write_mutex);
109+
while (true) {
110+
111+
if (k_mutex_lock(&write_mutex, K_MSEC(10)) == 0){
112+
server->send_response();
113+
k_mutex_unlock(&write_mutex);
114+
k_msleep(1);
115+
break;
116+
} else {
117+
k_msleep(1);
118+
}
119+
120+
}
99121

100122
}
101123

102124
template<typename RType, typename... Args>
103125
bool call(const MsgPack::str_t method, RType& result, Args&&... args) {
104126

105127
// 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);
128+
while (true) {
129+
if (k_mutex_lock(&write_mutex, K_MSEC(10)) == 0) {
130+
client->send_rpc(method, std::forward<Args>(args)...);
131+
k_mutex_unlock(&write_mutex);
132+
k_msleep(1);
133+
break;
134+
} else {
135+
k_msleep(1);
136+
}
137+
}
109138

110139
// Lock read mutex
111-
while(1) {
112-
k_mutex_lock(&read_mutex, K_FOREVER);
113-
if (client->get_response(result)) {
140+
while(true) {
141+
if (k_mutex_lock(&read_mutex, K_MSEC(10) == 0 )) {
142+
if (client->get_response(result)) {
143+
k_mutex_unlock(&read_mutex);
144+
k_msleep(1);
145+
break;
146+
}
114147
k_mutex_unlock(&read_mutex);
115-
break;
148+
k_msleep(1);
149+
} else {
150+
k_msleep(1);
116151
}
117-
k_mutex_unlock(&read_mutex);
118-
k_msleep(1);
152+
119153
}
120154

121155
return (client->lastError.code == NO_ERR);
@@ -140,20 +174,40 @@ class BridgeClass {
140174
void update_safe() {
141175

142176
// Lock read mutex
143-
k_msleep(1);
144-
k_mutex_lock(&read_mutex, K_FOREVER);
177+
if (k_mutex_lock(&read_mutex, K_MSEC(10)) != 0 ) return;
178+
145179
if (!server->get_rpc()) {
146180
k_mutex_unlock(&read_mutex);
181+
k_msleep(1);
147182
return;
148183
}
184+
149185
k_mutex_unlock(&read_mutex);
150186

151-
server->process_request("__safe__");
187+
while (true) {
188+
if (k_mutex_lock(&proc_mutex, K_MSEC(10)) == 0){
189+
server->process_request("__safe__");
190+
k_mutex_unlock(&proc_mutex);
191+
k_msleep(1);
192+
break;
193+
} else {
194+
k_msleep(1);
195+
}
196+
}
152197

153198
// Lock write mutex
154-
k_mutex_lock(&write_mutex, K_FOREVER);
155-
server->send_response();
156-
k_mutex_unlock(&write_mutex);
199+
while (true) {
200+
201+
if (k_mutex_lock(&write_mutex, K_MSEC(10)) == 0){
202+
server->send_response();
203+
k_mutex_unlock(&write_mutex);
204+
k_msleep(1);
205+
break;
206+
} else {
207+
k_msleep(1);
208+
}
209+
210+
}
157211

158212
}
159213

0 commit comments

Comments
 (0)