@@ -25,6 +25,8 @@ static void _mdns_browse_finish(mdns_browse_t *browse);
25
25
static void _mdns_browse_add (mdns_browse_t * browse );
26
26
static void _mdns_browse_send (mdns_browse_t * browse , mdns_if_t interface );
27
27
28
+ static void _mdns_task_free_with_caps (void );
29
+
28
30
#if CONFIG_ETH_ENABLED && CONFIG_MDNS_PREDEF_NETIF_ETH
29
31
#include "esp_eth.h"
30
32
#endif
@@ -62,6 +64,7 @@ static const char *TAG = "mdns";
62
64
63
65
static volatile TaskHandle_t _mdns_service_task_handle = NULL ;
64
66
static SemaphoreHandle_t _mdns_service_semaphore = NULL ;
67
+ StackType_t * _mdns_stack_buffer ;
65
68
66
69
static void _mdns_search_finish_done (void );
67
70
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 );
@@ -5424,8 +5427,8 @@ static void _mdns_service_task(void *pvParameters)
5424
5427
vTaskDelay (500 * portTICK_PERIOD_MS );
5425
5428
}
5426
5429
}
5430
+ _mdns_task_free_with_caps ();
5427
5431
_mdns_service_task_handle = NULL ;
5428
- vTaskDelete (NULL );
5429
5432
}
5430
5433
5431
5434
static void _mdns_timer_cb (void * arg )
@@ -5462,6 +5465,32 @@ static esp_err_t _mdns_stop_timer(void)
5462
5465
return err ;
5463
5466
}
5464
5467
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
+
5465
5494
/**
5466
5495
* @brief Start the service thread if not running
5467
5496
*
@@ -5471,30 +5500,35 @@ static esp_err_t _mdns_stop_timer(void)
5471
5500
*/
5472
5501
static esp_err_t _mdns_service_task_start (void )
5473
5502
{
5503
+ esp_err_t ret = ESP_OK ;
5474
5504
if (!_mdns_service_semaphore ) {
5475
5505
_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" );
5479
5507
}
5480
5508
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
+
5485
5511
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
5495
5521
}
5496
5522
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 ;
5498
5532
}
5499
5533
5500
5534
/**
@@ -5511,7 +5545,7 @@ static esp_err_t _mdns_service_task_stop(void)
5511
5545
mdns_action_t * a = & action ;
5512
5546
action .type = ACTION_TASK_STOP ;
5513
5547
if (xQueueSend (_mdns_server -> action_queue , & a , (TickType_t )0 ) != pdPASS ) {
5514
- vTaskDelete ( _mdns_service_task_handle );
5548
+ _mdns_task_free_with_caps ( );
5515
5549
_mdns_service_task_handle = NULL ;
5516
5550
}
5517
5551
while (_mdns_service_task_handle ) {
0 commit comments