@@ -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
190241void __loopHook (){
242+ k_msleep (1 );
191243 safeUpdate ();
192244}
193245
0 commit comments