@@ -62,6 +62,7 @@ static const char *TAG = "mdns";
6262
6363static volatile TaskHandle_t _mdns_service_task_handle = NULL ;
6464static SemaphoreHandle_t _mdns_service_semaphore = NULL ;
65+ static StackType_t * _mdns_stack_buffer ;
6566
6667static void _mdns_search_finish_done (void );
6768static 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)
54625463 return err ;
54635464}
54645465
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+
54655486/**
54665487 * @brief Start the service thread if not running
54675488 *
@@ -5471,30 +5492,35 @@ static esp_err_t _mdns_stop_timer(void)
54715492 */
54725493static esp_err_t _mdns_service_task_start (void )
54735494{
5495+ esp_err_t ret = ESP_OK ;
54745496 if (!_mdns_service_semaphore ) {
54755497 _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" );
54795499 }
54805500 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+
54855503 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
54955513 }
54965514 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 ;
54985524}
54995525
55005526/**
@@ -5741,6 +5767,8 @@ void mdns_free(void)
57415767 mdns_service_remove_all ();
57425768 free_delegated_hostnames ();
57435769 _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 );
57445772 for (i = 0 ; i < MDNS_MAX_INTERFACES ; i ++ ) {
57455773 for (j = 0 ; j < MDNS_IP_PROTOCOL_MAX ; j ++ ) {
57465774 mdns_pcb_deinit_local (i , j );
0 commit comments