diff --git a/components/esp_websocket_client/esp_websocket_client.c b/components/esp_websocket_client/esp_websocket_client.c index 6b2833f42..d76b30008 100644 --- a/components/esp_websocket_client/esp_websocket_client.c +++ b/components/esp_websocket_client/esp_websocket_client.c @@ -78,6 +78,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; @@ -604,7 +605,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; } @@ -621,6 +622,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 db521c2d0..6a8bca2b9 100644 --- a/components/esp_websocket_client/include/esp_websocket_client.h +++ b/components/esp_websocket_client/include/esp_websocket_client.h @@ -125,6 +125,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 @@ -136,7 +139,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