@@ -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