@@ -159,6 +159,7 @@ void engine_update_tx_time(void)
159
159
160
160
static void set_sm_state (uint8_t sm_state )
161
161
{
162
+ k_mutex_lock (& client .mutex , K_FOREVER );
162
163
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE ;
163
164
164
165
/* Determine if a callback to the app is needed */
@@ -195,7 +196,6 @@ static void set_sm_state(uint8_t sm_state)
195
196
}
196
197
}
197
198
198
- /* TODO: add locking? */
199
199
client .engine_state = sm_state ;
200
200
201
201
if (event > LWM2M_RD_CLIENT_EVENT_NONE && client .ctx -> event_cb ) {
@@ -210,33 +210,45 @@ static void set_sm_state(uint8_t sm_state)
210
210
lwm2m_close_socket (client .ctx );
211
211
}
212
212
}
213
+ k_mutex_unlock (& client .mutex );
213
214
}
214
215
215
216
static bool sm_is_bootstrap (void )
216
217
{
217
218
#if defined(CONFIG_LWM2M_RD_CLIENT_SUPPORT_BOOTSTRAP )
218
- return (client .engine_state >= ENGINE_DO_BOOTSTRAP_REG &&
219
+ k_mutex_lock (& client .mutex , K_FOREVER );
220
+ bool is_bootstrap = (client .engine_state >= ENGINE_DO_BOOTSTRAP_REG &&
219
221
client .engine_state <= ENGINE_BOOTSTRAP_TRANS_DONE );
222
+ k_mutex_unlock (& client .mutex );
223
+ return is_bootstrap ;
220
224
#else
221
225
return false;
222
226
#endif
223
227
}
224
228
225
229
static bool sm_is_registered (void )
226
230
{
227
- return (client .engine_state >= ENGINE_REGISTRATION_DONE &&
228
- client .engine_state <= ENGINE_DEREGISTER_SENT );
231
+ k_mutex_lock (& client .mutex , K_FOREVER );
232
+ bool registered = (client .engine_state >= ENGINE_REGISTRATION_DONE &&
233
+ client .engine_state <= ENGINE_DEREGISTER_SENT );
234
+
235
+ k_mutex_unlock (& client .mutex );
236
+ return registered ;
229
237
}
230
238
231
239
static uint8_t get_sm_state (void )
232
240
{
233
- /* TODO: add locking? */
234
- return client .engine_state ;
241
+ k_mutex_lock (& client .mutex , K_FOREVER );
242
+ uint8_t state = client .engine_state ;
243
+
244
+ k_mutex_unlock (& client .mutex );
245
+ return state ;
235
246
}
236
247
237
248
static void sm_handle_timeout_state (struct lwm2m_message * msg ,
238
249
enum sm_engine_state sm_state )
239
250
{
251
+ k_mutex_lock (& client .mutex , K_FOREVER );
240
252
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE ;
241
253
242
254
#if defined(CONFIG_LWM2M_RD_CLIENT_SUPPORT_BOOTSTRAP )
@@ -261,10 +273,12 @@ static void sm_handle_timeout_state(struct lwm2m_message *msg,
261
273
if (event > LWM2M_RD_CLIENT_EVENT_NONE && client .ctx -> event_cb ) {
262
274
client .ctx -> event_cb (client .ctx , event );
263
275
}
276
+ k_mutex_unlock (& client .mutex );
264
277
}
265
278
266
279
static void sm_handle_failure_state (enum sm_engine_state sm_state )
267
280
{
281
+ k_mutex_lock (& client .mutex , K_FOREVER );
268
282
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE ;
269
283
270
284
#if defined(CONFIG_LWM2M_RD_CLIENT_SUPPORT_BOOTSTRAP )
@@ -276,6 +290,7 @@ static void sm_handle_failure_state(enum sm_engine_state sm_state)
276
290
event = LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE ;
277
291
} else if (client .engine_state == ENGINE_UPDATE_SENT ) {
278
292
sm_handle_registration_update_failure ();
293
+ k_mutex_unlock (& client .mutex );
279
294
return ;
280
295
} else if (client .engine_state == ENGINE_DEREGISTER_SENT ) {
281
296
event = LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE ;
@@ -287,6 +302,7 @@ static void sm_handle_failure_state(enum sm_engine_state sm_state)
287
302
if (event > LWM2M_RD_CLIENT_EVENT_NONE && client .ctx -> event_cb ) {
288
303
client .ctx -> event_cb (client .ctx , event );
289
304
}
305
+ k_mutex_unlock (& client .mutex );
290
306
}
291
307
292
308
/* force state machine restart */
@@ -308,17 +324,19 @@ static void socket_fault_cb(int error)
308
324
/* force re-update with remote peer */
309
325
void engine_trigger_update (bool update_objects )
310
326
{
327
+ k_mutex_lock (& client .mutex , K_FOREVER );
311
328
if (client .engine_state < ENGINE_REGISTRATION_SENT ||
312
329
client .engine_state > ENGINE_UPDATE_SENT ) {
330
+ k_mutex_unlock (& client .mutex );
313
331
return ;
314
332
}
315
333
316
- /* TODO: add locking? */
317
334
client .trigger_update = true;
318
335
319
336
if (update_objects ) {
320
337
client .update_objects = true;
321
338
}
339
+ k_mutex_unlock (& client .mutex );
322
340
}
323
341
324
342
static inline const char * code2str (uint8_t code )
@@ -384,15 +402,18 @@ static void do_bootstrap_reg_timeout_cb(struct lwm2m_message *msg)
384
402
int engine_trigger_bootstrap (void )
385
403
{
386
404
#if defined(CONFIG_LWM2M_RD_CLIENT_SUPPORT_BOOTSTRAP )
405
+ k_mutex_lock (& client .mutex , K_FOREVER );
387
406
if (!sm_is_registered ()) {
388
407
/* Bootstrap is not possible to trig */
389
408
LOG_WRN ("Cannot trigger bootstrap from state %u" , client .engine_state );
409
+ k_mutex_unlock (& client .mutex );
390
410
return - EPERM ;
391
411
}
392
412
393
413
LOG_INF ("Server Initiated Bootstrap" );
394
414
client .use_bootstrap = true;
395
415
client .engine_state = ENGINE_INIT ;
416
+ k_mutex_unlock (& client .mutex );
396
417
397
418
return 0 ;
398
419
#else
@@ -924,8 +945,10 @@ static int sm_send_registration(bool send_obj_support_data,
924
945
925
946
static void sm_handle_registration_update_failure (void )
926
947
{
948
+ k_mutex_lock (& client .mutex , K_FOREVER );
927
949
LOG_WRN ("Registration Update fail -> trigger full registration" );
928
950
client .engine_state = ENGINE_SEND_REGISTRATION ;
951
+ k_mutex_unlock (& client .mutex );
929
952
}
930
953
931
954
static int sm_send_registration_msg (void )
@@ -999,6 +1022,7 @@ static int sm_do_registration(void)
999
1022
1000
1023
static int sm_registration_done (void )
1001
1024
{
1025
+ k_mutex_lock (& client .mutex , K_FOREVER );
1002
1026
int ret = 0 ;
1003
1027
1004
1028
/*
@@ -1016,7 +1040,7 @@ static int sm_registration_done(void)
1016
1040
CONFIG_LWM2M_QUEUE_MODE_UPTIME )) {
1017
1041
set_sm_state (ENGINE_REGISTRATION_DONE_RX_OFF );
1018
1042
}
1019
-
1043
+ k_mutex_unlock ( & client . mutex );
1020
1044
return ret ;
1021
1045
}
1022
1046
@@ -1306,11 +1330,11 @@ int lwm2m_rd_client_stop(struct lwm2m_ctx *client_ctx,
1306
1330
1307
1331
LOG_INF ("Stop LWM2M Client: %s" , client .ep_name );
1308
1332
1309
- k_mutex_unlock (& client .mutex );
1310
1333
1311
1334
while (get_sm_state () != ENGINE_IDLE ) {
1312
1335
k_sleep (K_MSEC (STATE_MACHINE_UPDATE_INTERVAL_MS / 2 ));
1313
1336
}
1337
+ k_mutex_unlock (& client .mutex );
1314
1338
return 0 ;
1315
1339
}
1316
1340
@@ -1432,9 +1456,10 @@ int lwm2m_rd_client_timeout(struct lwm2m_ctx *client_ctx)
1432
1456
if (!sm_is_registered ()) {
1433
1457
return 0 ;
1434
1458
}
1435
-
1459
+ k_mutex_lock ( & client . mutex , K_FOREVER );
1436
1460
LOG_WRN ("Confirmable Timeout -> Re-connect and register" );
1437
1461
client .engine_state = ENGINE_DO_REGISTRATION ;
1462
+ k_mutex_unlock (& client .mutex );
1438
1463
return 0 ;
1439
1464
}
1440
1465
0 commit comments