diff --git a/components/esp_http_server/include/esp_http_server.h b/components/esp_http_server/include/esp_http_server.h index 793f3dd80..93dae4dc7 100644 --- a/components/esp_http_server/include/esp_http_server.h +++ b/components/esp_http_server/include/esp_http_server.h @@ -585,7 +585,7 @@ esp_err_t httpd_sess_set_pending_override(httpd_handle_t hd, int sockfd, httpd_p * session socket fd, from within a URI handler, ie. : * httpd_sess_get_ctx(), * httpd_sess_trigger_close(), - * httpd_sess_update_timestamp(). + * httpd_sess_update_lru_counter(). * * @note This API is supposed to be called only from the context of * a URI handler where httpd_req_t* request pointer is valid. @@ -1111,15 +1111,15 @@ void *httpd_get_global_transport_ctx(httpd_handle_t handle); esp_err_t httpd_sess_trigger_close(httpd_handle_t handle, int sockfd); /** - * @brief Update timestamp for a given socket + * @brief Update LRU counter for a given socket * - * Timestamps are internally associated with each session to monitor + * LRU Counters are internally associated with each session to monitor * how recently a session exchanged traffic. When LRU purge is enabled, * if a client is requesting for connection but maximum number of * sockets/sessions is reached, then the session having the earliest - * timestamp is closed automatically. + * LRU counter is closed automatically. * - * Updating the timestamp manually prevents the socket from being purged + * Updating the LRU counter manually prevents the socket from being purged * due to the Least Recently Used (LRU) logic, even though it might not * have received traffic for some time. This is useful when all open * sockets/session are frequently exchanging traffic but the user specifically @@ -1130,15 +1130,15 @@ esp_err_t httpd_sess_trigger_close(httpd_handle_t handle, int sockfd); * is enabled. * * @param[in] handle Handle to server returned by httpd_start - * @param[in] sockfd The socket descriptor of the session for which timestamp + * @param[in] sockfd The socket descriptor of the session for which LRU counter * is to be updated * * @return - * - ESP_OK : Socket found and timestamp updated + * - ESP_OK : Socket found and LRU counter updated * - ESP_ERR_NOT_FOUND : Socket not found * - ESP_ERR_INVALID_ARG : Null arguments */ -esp_err_t httpd_sess_update_timestamp(httpd_handle_t handle, int sockfd); +esp_err_t httpd_sess_update_lru_counter(httpd_handle_t handle, int sockfd); /** End of Session * @} diff --git a/components/esp_http_server/src/esp_httpd_priv.h b/components/esp_http_server/src/esp_httpd_priv.h index 68bc9d64d..8cbd0e94c 100644 --- a/components/esp_http_server/src/esp_httpd_priv.h +++ b/components/esp_http_server/src/esp_httpd_priv.h @@ -125,7 +125,7 @@ struct sock_db { httpd_send_func_t send_fn; /*!< Send function for this socket */ httpd_recv_func_t recv_fn; /*!< Receive function for this socket */ httpd_pending_func_t pending_fn; /*!< Pending function for this socket */ - int64_t timestamp; /*!< Timestamp indicating when the socket was last used */ + uint64_t lru_counter; /*!< LRU Counter indicating when the socket was last used */ char pending_data[PARSER_BLOCK_SIZE]; /*!< Buffer for pending data to be received */ size_t pending_len; /*!< Length of pending data to be received */ }; diff --git a/components/esp_http_server/src/httpd_sess.c b/components/esp_http_server/src/httpd_sess.c index 8c0601fd4..640f37d27 100644 --- a/components/esp_http_server/src/httpd_sess.c +++ b/components/esp_http_server/src/httpd_sess.c @@ -195,6 +195,12 @@ static int fd_is_valid(int fd) return fcntl(fd, F_GETFD) != -1 || errno != EBADF; } +static inline uint64_t httpd_sess_get_lru_counter() +{ + static uint64_t lru_counter = 0; + return lru_counter++; +} + void httpd_sess_delete_invalid(struct httpd_data *hd) { for (int i = 0; i < hd->config.max_open_sockets; i++) { @@ -297,11 +303,11 @@ esp_err_t httpd_sess_process(struct httpd_data *hd, int newfd) return ESP_FAIL; } ESP_LOGD(TAG, LOG_FMT("success")); - sd->timestamp = httpd_os_get_timestamp(); + sd->lru_counter = httpd_sess_get_lru_counter(); return ESP_OK; } -esp_err_t httpd_sess_update_timestamp(httpd_handle_t handle, int sockfd) +esp_err_t httpd_sess_update_lru_counter(httpd_handle_t handle, int sockfd) { if (handle == NULL) { return ESP_ERR_INVALID_ARG; @@ -312,7 +318,7 @@ esp_err_t httpd_sess_update_timestamp(httpd_handle_t handle, int sockfd) int i; for (i = 0; i < hd->config.max_open_sockets; i++) { if (hd->hd_sd[i].fd == sockfd) { - hd->hd_sd[i].timestamp = httpd_os_get_timestamp(); + hd->hd_sd[i].lru_counter = httpd_sess_get_lru_counter(); return ESP_OK; } } @@ -321,7 +327,7 @@ esp_err_t httpd_sess_update_timestamp(httpd_handle_t handle, int sockfd) esp_err_t httpd_sess_close_lru(struct httpd_data *hd) { - int64_t timestamp = INT64_MAX; + uint64_t lru_counter = UINT64_MAX; int lru_fd = -1; int i; for (i = 0; i < hd->config.max_open_sockets; i++) { @@ -332,8 +338,8 @@ esp_err_t httpd_sess_close_lru(struct httpd_data *hd) if (hd->hd_sd[i].fd == -1) { return ESP_OK; } - if (hd->hd_sd[i].timestamp < timestamp) { - timestamp = hd->hd_sd[i].timestamp; + if (hd->hd_sd[i].lru_counter < lru_counter) { + lru_counter = hd->hd_sd[i].lru_counter; lru_fd = hd->hd_sd[i].fd; } } diff --git a/components/esp_http_server/src/port/esp32/osal.h b/components/esp_http_server/src/port/esp32/osal.h index d4e76fcd7..55ebe309a 100644 --- a/components/esp_http_server/src/port/esp32/osal.h +++ b/components/esp_http_server/src/port/esp32/osal.h @@ -52,11 +52,6 @@ static inline void httpd_os_thread_sleep(int msecs) vTaskDelay(msecs / portTICK_RATE_MS); } -static inline int64_t httpd_os_get_timestamp() -{ - return esp_timer_get_time(); -} - static inline othread_t httpd_os_thread_handle() { return xTaskGetCurrentTaskHandle();