@@ -62,6 +62,7 @@ static const char *TAG = "mdns";
62
62
63
63
static volatile TaskHandle_t _mdns_service_task_handle = NULL ;
64
64
static SemaphoreHandle_t _mdns_service_semaphore = NULL ;
65
+ static StackType_t * _mdns_stack_buffer ;
65
66
66
67
static void _mdns_search_finish_done (void );
67
68
static mdns_search_once_t * _mdns_search_find_from (mdns_search_once_t * search , mdns_name_t * name , uint16_t type , mdns_if_t tcpip_if , mdns_ip_protocol_t ip_protocol );
@@ -5462,6 +5463,26 @@ static esp_err_t _mdns_stop_timer(void)
5462
5463
return err ;
5463
5464
}
5464
5465
5466
+ static esp_err_t _mdns_task_create_with_caps (void )
5467
+ {
5468
+ ESP_LOGI (TAG , "mDNS task will be created from %s" , MDNS_TASK_MEMORY_LOG );
5469
+ esp_err_t ret = ESP_OK ;
5470
+ static StaticTask_t mdns_task_buffer ;
5471
+
5472
+ // Allocate memory for the mDNS task's stack using the MDNS_TASK_MEMORY_CAPS
5473
+ _mdns_stack_buffer = heap_caps_malloc (MDNS_SERVICE_STACK_DEPTH , MDNS_TASK_MEMORY_CAPS );
5474
+ ESP_GOTO_ON_FALSE (_mdns_stack_buffer != NULL , ESP_FAIL , err , TAG , "failed to allocate memory for the mDNS task's stack" );
5475
+
5476
+ _mdns_service_task_handle = xTaskCreateStaticPinnedToCore ( _mdns_service_task , "mdns" , MDNS_SERVICE_STACK_DEPTH , NULL , MDNS_TASK_PRIORITY , _mdns_stack_buffer , & mdns_task_buffer , MDNS_TASK_AFFINITY );
5477
+ ESP_GOTO_ON_FALSE (_mdns_service_task_handle != NULL , ESP_FAIL , err , TAG , "failed to create task for the mDNS" );
5478
+
5479
+ return ret ;
5480
+
5481
+ err :
5482
+ heap_caps_free (_mdns_stack_buffer );
5483
+ return ret ;
5484
+ }
5485
+
5465
5486
/**
5466
5487
* @brief Start the service thread if not running
5467
5488
*
@@ -5471,30 +5492,35 @@ static esp_err_t _mdns_stop_timer(void)
5471
5492
*/
5472
5493
static esp_err_t _mdns_service_task_start (void )
5473
5494
{
5495
+ esp_err_t ret = ESP_OK ;
5474
5496
if (!_mdns_service_semaphore ) {
5475
5497
_mdns_service_semaphore = xSemaphoreCreateMutex ();
5476
- if (!_mdns_service_semaphore ) {
5477
- return ESP_FAIL ;
5478
- }
5498
+ ESP_RETURN_ON_FALSE (_mdns_service_semaphore != NULL , ESP_FAIL , TAG , "Failed to create the mDNS service lock" );
5479
5499
}
5480
5500
MDNS_SERVICE_LOCK ();
5481
- if (_mdns_start_timer ()) {
5482
- MDNS_SERVICE_UNLOCK ();
5483
- return ESP_FAIL ;
5484
- }
5501
+ ESP_GOTO_ON_ERROR (_mdns_start_timer (), err , TAG , "Failed to start the mDNS service timer" );
5502
+
5485
5503
if (!_mdns_service_task_handle ) {
5486
- xTaskCreatePinnedToCore ( _mdns_service_task , "mdns" , MDNS_SERVICE_STACK_DEPTH , NULL , MDNS_TASK_PRIORITY ,
5487
- ( TaskHandle_t * const )( & _mdns_service_task_handle ), MDNS_TASK_AFFINITY );
5488
- if (! _mdns_service_task_handle ) {
5489
- _mdns_stop_timer () ;
5490
- MDNS_SERVICE_UNLOCK () ;
5491
- vSemaphoreDelete ( _mdns_service_semaphore );
5492
- _mdns_service_semaphore = NULL ;
5493
- return ESP_FAIL ;
5494
- }
5504
+ ESP_GOTO_ON_ERROR ( _mdns_task_create_with_caps (), err_stop_timer , TAG , "Failed to start the mDNS service task" );
5505
+ #ifdef MDNS_ENABLE_DEBUG
5506
+ # if ! CONFIG_IDF_TARGET_LINUX
5507
+ StackType_t * mdns_debug_stack_buffer ;
5508
+ StaticTask_t * mdns_debug_task_buffer ;
5509
+ xTaskGetStaticBuffers ( _mdns_service_task_handle , & mdns_debug_stack_buffer , & mdns_debug_task_buffer );
5510
+ _mdns_dbg_printf ( "mdns_debug_stack_buffer:%p mdns_debug_task_buffer:%p\n" , mdns_debug_stack_buffer , mdns_debug_task_buffer ) ;
5511
+ #endif // CONFIG_IDF_TARGET_LINUX
5512
+ #endif // MDNS_ENABLE_DEBUG
5495
5513
}
5496
5514
MDNS_SERVICE_UNLOCK ();
5497
- return ESP_OK ;
5515
+ return ret ;
5516
+
5517
+ err_stop_timer :
5518
+ _mdns_stop_timer ();
5519
+ err :
5520
+ MDNS_SERVICE_UNLOCK ();
5521
+ vSemaphoreDelete (_mdns_service_semaphore );
5522
+ _mdns_service_semaphore = NULL ;
5523
+ return ret ;
5498
5524
}
5499
5525
5500
5526
/**
@@ -5741,6 +5767,8 @@ void mdns_free(void)
5741
5767
mdns_service_remove_all ();
5742
5768
free_delegated_hostnames ();
5743
5769
_mdns_service_task_stop ();
5770
+ // at this point, the service task is deleted, so we can destroy the stack size
5771
+ heap_caps_free (_mdns_stack_buffer );
5744
5772
for (i = 0 ; i < MDNS_MAX_INTERFACES ; i ++ ) {
5745
5773
for (j = 0 ; j < MDNS_IP_PROTOCOL_MAX ; j ++ ) {
5746
5774
mdns_pcb_deinit_local (i , j );
0 commit comments