@@ -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+
452467static 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
11811189static 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