Merge branch 'bugfix/mdns_incorrect_semaphore_use_v3.1' into 'release/v3.1'

mdns: use binary semaphore instead of mutex when searching (Backport 3.1)

See merge request idf/esp-idf!4479
This commit is contained in:
Jiang Jiang Jian
2019-03-20 11:25:44 +08:00
2 changed files with 7 additions and 12 deletions

View File

@@ -3098,7 +3098,7 @@ static void _mdns_search_free(mdns_search_once_t * search)
free(search->instance); free(search->instance);
free(search->service); free(search->service);
free(search->proto); free(search->proto);
vSemaphoreDelete(search->lock); vSemaphoreDelete(search->done_semaphore);
free(search); free(search);
} }
@@ -3114,8 +3114,8 @@ static mdns_search_once_t * _mdns_search_init(const char * name, const char * se
} }
memset(search, 0, sizeof(mdns_search_once_t)); memset(search, 0, sizeof(mdns_search_once_t));
search->lock = xSemaphoreCreateMutex(); search->done_semaphore = xSemaphoreCreateBinary();
if (!search->lock) { if (!search->done_semaphore) {
free(search); free(search);
return NULL; return NULL;
} }
@@ -3154,8 +3154,6 @@ static mdns_search_once_t * _mdns_search_init(const char * name, const char * se
search->started_at = xTaskGetTickCount() * portTICK_PERIOD_MS; search->started_at = xTaskGetTickCount() * portTICK_PERIOD_MS;
search->next = NULL; search->next = NULL;
xSemaphoreTake(search->lock, 0);
return search; return search;
} }
@@ -3166,7 +3164,7 @@ static void _mdns_search_finish(mdns_search_once_t * search)
{ {
search->state = SEARCH_OFF; search->state = SEARCH_OFF;
queueDetach(mdns_search_once_t, _mdns_server->search_once, search); queueDetach(mdns_search_once_t, _mdns_server->search_once, search);
xSemaphoreGive(search->lock); xSemaphoreGive(search->done_semaphore);
} }
/** /**
@@ -4192,7 +4190,7 @@ void mdns_free()
free(h->instance); free(h->instance);
free(h->service); free(h->service);
free(h->proto); free(h->proto);
vSemaphoreDelete(h->lock); vSemaphoreDelete(h->done_semaphore);
if (h->result) { if (h->result) {
mdns_query_results_free(h->result); mdns_query_results_free(h->result);
} }
@@ -4582,7 +4580,7 @@ esp_err_t mdns_query(const char * name, const char * service, const char * proto
_mdns_search_free(search); _mdns_search_free(search);
return ESP_ERR_NO_MEM; return ESP_ERR_NO_MEM;
} }
xSemaphoreTake(search->lock, portMAX_DELAY); xSemaphoreTake(search->done_semaphore, portMAX_DELAY);
*results = search->result; *results = search->result;
_mdns_search_free(search); _mdns_search_free(search);

View File

@@ -112,9 +112,6 @@
#define PCB_STATE_IS_ANNOUNCING(s) (s->state > PCB_PROBE_3 && s->state < PCB_RUNNING) #define PCB_STATE_IS_ANNOUNCING(s) (s->state > PCB_PROBE_3 && s->state < PCB_RUNNING)
#define PCB_STATE_IS_RUNNING(s) (s->state == PCB_RUNNING) #define PCB_STATE_IS_RUNNING(s) (s->state == PCB_RUNNING)
#define MDNS_SEARCH_LOCK() xSemaphoreTake(_mdns_server->search.lock, portMAX_DELAY)
#define MDNS_SEARCH_UNLOCK() xSemaphoreGive(_mdns_server->search.lock)
#ifndef HOOK_MALLOC_FAILED #ifndef HOOK_MALLOC_FAILED
#define HOOK_MALLOC_FAILED ESP_LOGE(TAG, "Cannot allocate memory (line: %d, free heap: %d bytes)", __LINE__, esp_get_free_heap_size()); #define HOOK_MALLOC_FAILED ESP_LOGE(TAG, "Cannot allocate memory (line: %d, free heap: %d bytes)", __LINE__, esp_get_free_heap_size());
#endif #endif
@@ -316,7 +313,7 @@ typedef struct mdns_search_once_s {
uint32_t started_at; uint32_t started_at;
uint32_t sent_at; uint32_t sent_at;
uint32_t timeout; uint32_t timeout;
SemaphoreHandle_t lock; SemaphoreHandle_t done_semaphore;
uint16_t type; uint16_t type;
uint8_t max_results; uint8_t max_results;
uint8_t num_results; uint8_t num_results;