esp_http_server: Add lru_socket flag in sock_db to indicate httpd_sess_close is called from httpd_sess_close_lru

This commit is contained in:
Shubham Kulkarni 2020-11-30 12:33:31 +05:30
parent 38ea44faaf
commit 9951421910
3 changed files with 5 additions and 3 deletions

View File

@ -69,6 +69,7 @@ struct sock_db {
httpd_recv_func_t recv_fn; /*!< Receive 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 */ httpd_pending_func_t pending_fn; /*!< Pending function for this socket */
uint64_t lru_counter; /*!< LRU Counter indicating when the socket was last used */ uint64_t lru_counter; /*!< LRU Counter indicating when the socket was last used */
bool lru_socket; /*!< Flag indicating LRU socket */
char pending_data[PARSER_BLOCK_SIZE]; /*!< Buffer for pending data to be received */ char pending_data[PARSER_BLOCK_SIZE]; /*!< Buffer for pending data to be received */
size_t pending_len; /*!< Length of pending data to be received */ size_t pending_len; /*!< Length of pending data to be received */
}; };

View File

@ -67,8 +67,6 @@ static esp_err_t httpd_accept_conn(struct httpd_data *hd, int listen_fd)
close(new_fd); close(new_fd);
return ESP_FAIL; return ESP_FAIL;
} }
httpd_sess_update_lru_counter(hd->hd_sd->handle, new_fd);
ESP_LOGD(TAG, LOG_FMT("complete")); ESP_LOGD(TAG, LOG_FMT("complete"));
return ESP_OK; return ESP_OK;
} }

View File

@ -348,6 +348,8 @@ esp_err_t httpd_sess_close_lru(struct httpd_data *hd)
} }
} }
ESP_LOGD(TAG, LOG_FMT("fd = %d"), lru_fd); ESP_LOGD(TAG, LOG_FMT("fd = %d"), lru_fd);
struct sock_db *sd = httpd_sess_get(hd, lru_fd);
sd->lru_socket = true;
return httpd_sess_trigger_close(hd, lru_fd); return httpd_sess_trigger_close(hd, lru_fd);
} }
@ -378,11 +380,12 @@ static void httpd_sess_close(void *arg)
{ {
struct sock_db *sock_db = (struct sock_db *)arg; struct sock_db *sock_db = (struct sock_db *)arg;
if (sock_db) { if (sock_db) {
if (sock_db->lru_counter == 0) { if (sock_db->lru_counter == 0 && !sock_db->lru_socket) {
ESP_LOGD(TAG, "Skipping session close for %d as it seems to be a race condition", sock_db->fd); ESP_LOGD(TAG, "Skipping session close for %d as it seems to be a race condition", sock_db->fd);
return; return;
} }
int fd = sock_db->fd; int fd = sock_db->fd;
sock_db->lru_socket = false;
struct httpd_data *hd = (struct httpd_data *) sock_db->handle; struct httpd_data *hd = (struct httpd_data *) sock_db->handle;
httpd_sess_delete(hd, fd); httpd_sess_delete(hd, fd);
close(fd); close(fd);