@@ -205,6 +205,19 @@ static void DefaultIoTHubSendReportedStateCompletedCallback(int http_status_code
205
205
Log_Debug ("context:0x%x" , context );
206
206
ADUC_D2C_Message_Processing_Context * message_processing_context = (ADUC_D2C_Message_Processing_Context * )context ;
207
207
int computed = false;
208
+
209
+ if (message_processing_context == NULL )
210
+ {
211
+ Log_Error ("context is NULL" );
212
+ return ;
213
+ }
214
+
215
+ if (!message_processing_context -> initialized )
216
+ {
217
+ Log_Warn ("Message processing context (0x%x) is not initialized." , message_processing_context );
218
+ return ;
219
+ }
220
+
208
221
pthread_mutex_lock (& message_processing_context -> mutex );
209
222
message_processing_context -> message .lastHttpStatus = http_status_code ;
210
223
@@ -328,10 +341,30 @@ void ADUC_D2C_Messaging_DoWork()
328
341
}
329
342
}
330
343
344
+ /**
345
+ * @brief Processes the message.
346
+ * @param message_processing_context The message processing context.
347
+ * @return Returns true if the message is sent.
348
+ * @remark This function must be called every 100ms - 200ms to ensure that the Device to Cloud messages
349
+ * are processed in timely manner but also yield the CPU to other tasks.
350
+ */
331
351
static void ProcessMessage (ADUC_D2C_Message_Processing_Context * message_processing_context )
332
352
{
333
353
bool shouldSend = false;
334
354
time_t now = GetTimeSinceEpochInSeconds ();
355
+
356
+ if (message_processing_context == NULL )
357
+ {
358
+ Log_Error ("context is NULL" );
359
+ return ;
360
+ }
361
+
362
+ if (!message_processing_context -> initialized )
363
+ {
364
+ Log_Warn ("Message processing context (0x%x) is not initialized." , message_processing_context );
365
+ return ;
366
+ }
367
+
335
368
pthread_mutex_lock (& s_pendingMessageStoreMutex );
336
369
pthread_mutex_lock (& message_processing_context -> mutex );
337
370
@@ -427,15 +460,17 @@ bool ADUC_D2C_Messaging_Init()
427
460
memset (& s_pendingMessageStore , 0 , sizeof (s_pendingMessageStore ));
428
461
for (i = 0 ; i < ADUC_D2C_Message_Type_Max ; i ++ )
429
462
{
430
- s_messageProcessingContext [i ].type = i ;
431
- s_messageProcessingContext [i ].transportFunc = ADUC_D2C_Default_Message_Transport_Function ;
432
- s_messageProcessingContext [i ].retryStrategy = & g_defaultRetryStrategy ;
433
- int res = pthread_mutex_init (& s_messageProcessingContext [i ].mutex , NULL );
463
+ int res = pthread_mutex_init (& s_messageProcessingContext [i ].mutex , NULL );
434
464
if (res != 0 )
435
465
{
436
466
Log_Error ("Can't init mutex for type %d. (err:%d)" , i , res );
437
467
goto done ;
438
468
}
469
+ s_messageProcessingContext [i ].type = i ;
470
+ s_messageProcessingContext [i ].transportFunc = ADUC_D2C_Default_Message_Transport_Function ;
471
+ s_messageProcessingContext [i ].retryStrategy = & g_defaultRetryStrategy ;
472
+ s_messageProcessingContext [i ].initialized = true;
473
+ Log_Debug ("Message processing context initialized. (t:%d)" , i );
439
474
}
440
475
s_core_initialized = true;
441
476
}
@@ -456,7 +491,7 @@ void ADUC_D2C_Messaging_Uninit()
456
491
if (s_core_initialized )
457
492
{
458
493
// Cancel pending messages
459
- for (int i = 0 ; i < ADUC_D2C_Message_Type_Max ; i ++ )
494
+ for (int i = 0 ; i < ADUC_D2C_Message_Type_Max && s_messageProcessingContext [ i ]. initialized ; i ++ )
460
495
{
461
496
pthread_mutex_lock (& s_messageProcessingContext [i ].mutex );
462
497
if (s_pendingMessageStore [i ].content != NULL )
@@ -546,6 +581,11 @@ bool ADUC_D2C_Message_SendAsync(
546
581
*/
547
582
void ADUC_D2C_Messaging_Set_Transport (ADUC_D2C_Message_Type type , ADUC_D2C_MESSAGE_TRANSPORT_FUNCTION transportFunc )
548
583
{
584
+ if (!s_messageProcessingContext [type ].initialized )
585
+ {
586
+ Log_Error ("Message processing context (0x%x) is not initialized." , & s_messageProcessingContext [type ]);
587
+ return ;
588
+ }
549
589
pthread_mutex_lock (& s_messageProcessingContext [type ].mutex );
550
590
s_messageProcessingContext [type ].transportFunc = transportFunc ;
551
591
pthread_mutex_unlock (& s_messageProcessingContext [type ].mutex );
0 commit comments