@@ -25,6 +25,8 @@ static void _mdns_browse_finish(mdns_browse_t *browse);
2525static void _mdns_browse_add (mdns_browse_t * browse );
2626static void _mdns_browse_send (mdns_browse_t * browse , mdns_if_t interface );
2727
28+ static void _mdns_task_free_with_caps (void );
29+
2830#if CONFIG_ETH_ENABLED && CONFIG_MDNS_PREDEF_NETIF_ETH
2931#include "esp_eth.h"
3032#endif
@@ -62,6 +64,7 @@ static const char *TAG = "mdns";
6264
6365static volatile TaskHandle_t _mdns_service_task_handle = NULL ;
6466static SemaphoreHandle_t _mdns_service_semaphore = NULL ;
67+ StackType_t * _mdns_stack_buffer ;
6568
6669static void _mdns_search_finish_done (void );
6770static 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 );
@@ -5424,8 +5427,8 @@ static void _mdns_service_task(void *pvParameters)
54245427 vTaskDelay (500 * portTICK_PERIOD_MS );
54255428 }
54265429 }
5430+ _mdns_task_free_with_caps ();
54275431 _mdns_service_task_handle = NULL ;
5428- vTaskDelete (NULL );
54295432}
54305433
54315434static void _mdns_timer_cb (void * arg )
@@ -5462,6 +5465,32 @@ static esp_err_t _mdns_stop_timer(void)
54625465 return err ;
54635466}
54645467
5468+ static esp_err_t _mdns_task_create_with_caps (void )
5469+ {
5470+ ESP_LOGI (TAG , "mDNS task will be created from %s" , MDNS_TASK_MEMORY_LOG );
5471+ esp_err_t ret = ESP_OK ;
5472+ static StaticTask_t mdns_task_buffer ;
5473+
5474+ // Allocate memory for the mDNS task's stack using the MDNS_TASK_MEMORY_CAPS
5475+ _mdns_stack_buffer = heap_caps_malloc (MDNS_SERVICE_STACK_DEPTH , MDNS_TASK_MEMORY_CAPS );
5476+ ESP_GOTO_ON_FALSE (_mdns_stack_buffer != NULL , ESP_FAIL , err , TAG , "failed to allocate memory for the mDNS task's stack" );
5477+
5478+ _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 );
5479+ ESP_GOTO_ON_FALSE (_mdns_service_task_handle != NULL , ESP_FAIL , err , TAG , "failed to create task for the mDNS" );
5480+
5481+ return ret ;
5482+
5483+ err :
5484+ heap_caps_free (_mdns_stack_buffer );
5485+ return ret ;
5486+ }
5487+
5488+ static void _mdns_task_free_with_caps (void )
5489+ {
5490+ vTaskDelete (_mdns_service_task_handle );
5491+ heap_caps_free (_mdns_stack_buffer );
5492+ }
5493+
54655494/**
54665495 * @brief Start the service thread if not running
54675496 *
@@ -5471,30 +5500,35 @@ static esp_err_t _mdns_stop_timer(void)
54715500 */
54725501static esp_err_t _mdns_service_task_start (void )
54735502{
5503+ esp_err_t ret = ESP_OK ;
54745504 if (!_mdns_service_semaphore ) {
54755505 _mdns_service_semaphore = xSemaphoreCreateMutex ();
5476- if (!_mdns_service_semaphore ) {
5477- return ESP_FAIL ;
5478- }
5506+ ESP_RETURN_ON_FALSE (_mdns_service_semaphore != NULL , ESP_FAIL , TAG , "Failed to create the mDNS service lock" );
54795507 }
54805508 MDNS_SERVICE_LOCK ();
5481- if (_mdns_start_timer ()) {
5482- MDNS_SERVICE_UNLOCK ();
5483- return ESP_FAIL ;
5484- }
5509+ ESP_GOTO_ON_ERROR (_mdns_start_timer (), err , TAG , "Failed to start the mDNS service timer" );
5510+
54855511 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- }
5512+ ESP_GOTO_ON_ERROR ( _mdns_task_create_with_caps (), err_stop_timer , TAG , "Failed to start the mDNS service task" );
5513+ #ifdef MDNS_ENABLE_DEBUG
5514+ # if ! CONFIG_IDF_TARGET_LINUX
5515+ StackType_t * mdns_debug_stack_buffer ;
5516+ StaticTask_t * mdns_debug_task_buffer ;
5517+ xTaskGetStaticBuffers ( _mdns_service_task_handle , & mdns_debug_stack_buffer , & mdns_debug_task_buffer );
5518+ _mdns_dbg_printf ( "mdns_debug_stack_buffer:%p mdns_debug_task_buffer:%p\n" , mdns_debug_stack_buffer , mdns_debug_task_buffer ) ;
5519+ #endif // CONFIG_IDF_TARGET_LINUX
5520+ #endif // MDNS_ENABLE_DEBUG
54955521 }
54965522 MDNS_SERVICE_UNLOCK ();
5497- return ESP_OK ;
5523+ return ret ;
5524+
5525+ err_stop_timer :
5526+ _mdns_stop_timer ();
5527+ err :
5528+ MDNS_SERVICE_UNLOCK ();
5529+ vSemaphoreDelete (_mdns_service_semaphore );
5530+ _mdns_service_semaphore = NULL ;
5531+ return ret ;
54985532}
54995533
55005534/**
@@ -5511,7 +5545,7 @@ static esp_err_t _mdns_service_task_stop(void)
55115545 mdns_action_t * a = & action ;
55125546 action .type = ACTION_TASK_STOP ;
55135547 if (xQueueSend (_mdns_server -> action_queue , & a , (TickType_t )0 ) != pdPASS ) {
5514- vTaskDelete ( _mdns_service_task_handle );
5548+ _mdns_task_free_with_caps ( );
55155549 _mdns_service_task_handle = NULL ;
55165550 }
55175551 while (_mdns_service_task_handle ) {
0 commit comments