Skip to content

Commit b57979d

Browse files
authored
Merge pull request #751 from johanstokking/fix/await-task-on-destroy
fix(websocket): wait for task on destroy (IDFGH-14533)
2 parents e069ae7 + 42674b4 commit b57979d

File tree

1 file changed

+23
-15
lines changed

1 file changed

+23
-15
lines changed

components/esp_websocket_client/esp_websocket_client.c

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,21 @@ static void destroy_and_free_resources(esp_websocket_client_handle_t client)
449449
client = NULL;
450450
}
451451

452+
static esp_err_t stop_wait_task(esp_websocket_client_handle_t client)
453+
{
454+
/* A running client cannot be stopped from the websocket task/event handler */
455+
TaskHandle_t running_task = xTaskGetCurrentTaskHandle();
456+
if (running_task == client->task_handle) {
457+
ESP_LOGE(TAG, "Client cannot be stopped from websocket task");
458+
return ESP_FAIL;
459+
}
460+
461+
client->run = false;
462+
xEventGroupWaitBits(client->status_bits, STOPPED_BIT, false, true, portMAX_DELAY);
463+
client->state = WEBSOCKET_STATE_UNKNOW;
464+
return ESP_OK;
465+
}
466+
452467
static esp_err_t set_websocket_transport_optional_settings(esp_websocket_client_handle_t client, const char *scheme)
453468
{
454469
esp_transport_handle_t trans = esp_transport_list_get_transport(client->transport_list, scheme);
@@ -754,6 +769,7 @@ esp_websocket_client_handle_t esp_websocket_client_init(const esp_websocket_clie
754769
ESP_WS_CLIENT_MEM_CHECK(TAG, client->status_bits, {
755770
goto _websocket_init_fail;
756771
});
772+
xEventGroupSetBits(client->status_bits, STOPPED_BIT);
757773

758774
client->buffer_size = buffer_size;
759775
return client;
@@ -768,9 +784,11 @@ esp_err_t esp_websocket_client_destroy(esp_websocket_client_handle_t client)
768784
if (client == NULL) {
769785
return ESP_ERR_INVALID_ARG;
770786
}
771-
if (client->run) {
772-
esp_websocket_client_stop(client);
787+
788+
if (client->status_bits && (STOPPED_BIT & xEventGroupGetBits(client->status_bits)) == 0) {
789+
stop_wait_task(client);
773790
}
791+
774792
destroy_and_free_resources(client);
775793
return ESP_OK;
776794
}
@@ -1159,23 +1177,13 @@ esp_err_t esp_websocket_client_stop(esp_websocket_client_handle_t client)
11591177
if (client == NULL) {
11601178
return ESP_ERR_INVALID_ARG;
11611179
}
1162-
if (!client->run) {
1163-
ESP_LOGW(TAG, "Client was not started");
1164-
return ESP_FAIL;
1165-
}
11661180

1167-
/* A running client cannot be stopped from the websocket task/event handler */
1168-
TaskHandle_t running_task = xTaskGetCurrentTaskHandle();
1169-
if (running_task == client->task_handle) {
1170-
ESP_LOGE(TAG, "Client cannot be stopped from websocket task");
1181+
if (xEventGroupGetBits(client->status_bits) & STOPPED_BIT) {
1182+
ESP_LOGW(TAG, "Client was not started");
11711183
return ESP_FAIL;
11721184
}
11731185

1174-
1175-
client->run = false;
1176-
xEventGroupWaitBits(client->status_bits, STOPPED_BIT, false, true, portMAX_DELAY);
1177-
client->state = WEBSOCKET_STATE_UNKNOW;
1178-
return ESP_OK;
1186+
return stop_wait_task(client);
11791187
}
11801188

11811189
static int esp_websocket_client_send_close(esp_websocket_client_handle_t client, int code, const char *additional_data, int total_len, TickType_t timeout)

0 commit comments

Comments
 (0)