diff --git a/components/esp_websocket_client/esp_websocket_client.c b/components/esp_websocket_client/esp_websocket_client.c index 9438f05d97..4e74bff43b 100644 --- a/components/esp_websocket_client/esp_websocket_client.c +++ b/components/esp_websocket_client/esp_websocket_client.c @@ -75,6 +75,7 @@ typedef enum { struct esp_websocket_client { esp_event_loop_handle_t event_handle; + TaskHandle_t task_handle; esp_transport_list_handle_t transport_list; esp_transport_handle_t transport; websocket_config_storage_t *config; @@ -565,7 +566,7 @@ esp_err_t esp_websocket_client_start(esp_websocket_client_handle_t client) ESP_LOGE(TAG, "The client has started"); return ESP_FAIL; } - if (xTaskCreate(esp_websocket_client_task, "websocket_task", client->config->task_stack, client, client->config->task_prio, NULL) != pdTRUE) { + if (xTaskCreate(esp_websocket_client_task, "websocket_task", client->config->task_stack, client, client->config->task_prio, &client->task_handle) != pdTRUE) { ESP_LOGE(TAG, "Error create websocket task"); return ESP_FAIL; } @@ -582,6 +583,15 @@ esp_err_t esp_websocket_client_stop(esp_websocket_client_handle_t client) ESP_LOGW(TAG, "Client was not started"); return ESP_FAIL; } + + /* A running client cannot be stopped from the websocket task/event handler */ + TaskHandle_t running_task = xTaskGetCurrentTaskHandle(); + if (running_task == client->task_handle) { + ESP_LOGE(TAG, "Client cannot be stopped from websocket task"); + return ESP_FAIL; + } + + client->run = false; xEventGroupWaitBits(client->status_bits, STOPPED_BIT, false, true, portMAX_DELAY); client->state = WEBSOCKET_STATE_UNKNOW; diff --git a/components/esp_websocket_client/include/esp_websocket_client.h b/components/esp_websocket_client/include/esp_websocket_client.h index 8a6a001dd4..294d050b5c 100644 --- a/components/esp_websocket_client/include/esp_websocket_client.h +++ b/components/esp_websocket_client/include/esp_websocket_client.h @@ -123,6 +123,9 @@ esp_err_t esp_websocket_client_start(esp_websocket_client_handle_t client); /** * @brief Close the WebSocket connection * + * Notes: + * - Cannot be called from the websocket event handler + * * @param[in] client The client * * @return esp_err_t @@ -134,7 +137,10 @@ esp_err_t esp_websocket_client_stop(esp_websocket_client_handle_t client); * This function must be the last function to call for an session. * It is the opposite of the esp_websocket_client_init function and must be called with the same handle as input that a esp_websocket_client_init call returned. * This might close all connections this handle has used. - * + * + * Notes: + * - Cannot be called from the websocket event handler + * * @param[in] client The client * * @return esp_err_t