mirror of
https://github.com/espressif/esp-protocols.git
synced 2025-07-16 12:02:11 +02:00
components/mdns: use semaphore instead of task notification bits (IDFGH-9380)
Component should not alter the task notification bits of the calling task.
This commit is contained in:
@ -4783,7 +4783,7 @@ static void _mdns_execute_action(mdns_action_t *action)
|
|||||||
_mdns_server->hostname = action->data.hostname_set.hostname;
|
_mdns_server->hostname = action->data.hostname_set.hostname;
|
||||||
_mdns_self_host.hostname = action->data.hostname_set.hostname;
|
_mdns_self_host.hostname = action->data.hostname_set.hostname;
|
||||||
_mdns_restart_all_pcbs();
|
_mdns_restart_all_pcbs();
|
||||||
xTaskNotifyGive(action->data.hostname_set.calling_task);
|
xSemaphoreGive(_mdns_server->action_sema);
|
||||||
break;
|
break;
|
||||||
case ACTION_INSTANCE_SET:
|
case ACTION_INSTANCE_SET:
|
||||||
_mdns_send_bye_all_pcbs_no_instance(false);
|
_mdns_send_bye_all_pcbs_no_instance(false);
|
||||||
@ -5326,6 +5326,12 @@ esp_err_t mdns_init(void)
|
|||||||
goto free_lock;
|
goto free_lock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_mdns_server->action_sema = xSemaphoreCreateBinary();
|
||||||
|
if (!_mdns_server->action_sema) {
|
||||||
|
err = ESP_ERR_NO_MEM;
|
||||||
|
goto free_queue;
|
||||||
|
}
|
||||||
|
|
||||||
#if CONFIG_MDNS_PREDEF_NETIF_STA || CONFIG_MDNS_PREDEF_NETIF_AP
|
#if CONFIG_MDNS_PREDEF_NETIF_STA || CONFIG_MDNS_PREDEF_NETIF_AP
|
||||||
if ((err = esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, mdns_preset_if_handle_system_event, NULL)) != ESP_OK) {
|
if ((err = esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, mdns_preset_if_handle_system_event, NULL)) != ESP_OK) {
|
||||||
goto free_event_handlers;
|
goto free_event_handlers;
|
||||||
@ -5381,6 +5387,8 @@ free_all_and_disable_pcbs:
|
|||||||
free_event_handlers:
|
free_event_handlers:
|
||||||
unregister_predefined_handlers();
|
unregister_predefined_handlers();
|
||||||
#endif
|
#endif
|
||||||
|
vSemaphoreDelete(_mdns_server->action_sema);
|
||||||
|
free_queue:
|
||||||
vQueueDelete(_mdns_server->action_queue);
|
vQueueDelete(_mdns_server->action_queue);
|
||||||
free_lock:
|
free_lock:
|
||||||
vSemaphoreDelete(_mdns_server->lock);
|
vSemaphoreDelete(_mdns_server->lock);
|
||||||
@ -5430,6 +5438,7 @@ void mdns_free(void)
|
|||||||
}
|
}
|
||||||
free(h);
|
free(h);
|
||||||
}
|
}
|
||||||
|
vSemaphoreDelete(_mdns_server->action_sema);
|
||||||
vSemaphoreDelete(_mdns_server->lock);
|
vSemaphoreDelete(_mdns_server->lock);
|
||||||
free(_mdns_server);
|
free(_mdns_server);
|
||||||
_mdns_server = NULL;
|
_mdns_server = NULL;
|
||||||
@ -5456,13 +5465,12 @@ esp_err_t mdns_hostname_set(const char *hostname)
|
|||||||
}
|
}
|
||||||
action->type = ACTION_HOSTNAME_SET;
|
action->type = ACTION_HOSTNAME_SET;
|
||||||
action->data.hostname_set.hostname = new_hostname;
|
action->data.hostname_set.hostname = new_hostname;
|
||||||
action->data.hostname_set.calling_task = xTaskGetCurrentTaskHandle();
|
|
||||||
if (xQueueSend(_mdns_server->action_queue, &action, (TickType_t)0) != pdPASS) {
|
if (xQueueSend(_mdns_server->action_queue, &action, (TickType_t)0) != pdPASS) {
|
||||||
free(new_hostname);
|
free(new_hostname);
|
||||||
free(action);
|
free(action);
|
||||||
return ESP_ERR_NO_MEM;
|
return ESP_ERR_NO_MEM;
|
||||||
}
|
}
|
||||||
xTaskNotifyWait(0, 0x01, NULL, portMAX_DELAY);
|
xSemaphoreTake(_mdns_server->action_sema, portMAX_DELAY);
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,6 +380,7 @@ typedef struct mdns_server_s {
|
|||||||
mdns_srv_item_t *services;
|
mdns_srv_item_t *services;
|
||||||
SemaphoreHandle_t lock;
|
SemaphoreHandle_t lock;
|
||||||
QueueHandle_t action_queue;
|
QueueHandle_t action_queue;
|
||||||
|
SemaphoreHandle_t action_sema;
|
||||||
mdns_tx_packet_t *tx_queue_head;
|
mdns_tx_packet_t *tx_queue_head;
|
||||||
mdns_search_once_t *search_once;
|
mdns_search_once_t *search_once;
|
||||||
esp_timer_handle_t timer_handle;
|
esp_timer_handle_t timer_handle;
|
||||||
@ -390,7 +391,6 @@ typedef struct {
|
|||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
char *hostname;
|
char *hostname;
|
||||||
TaskHandle_t calling_task;
|
|
||||||
} hostname_set;
|
} hostname_set;
|
||||||
char *instance;
|
char *instance;
|
||||||
struct {
|
struct {
|
||||||
|
Reference in New Issue
Block a user