1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-09 00:00:04 +01:00

pthreads: more locking

This commit is contained in:
Andy Green 2018-03-05 16:49:28 +08:00
parent cce9711653
commit 0d5ca2d87b
13 changed files with 112 additions and 73 deletions

View file

@ -245,7 +245,7 @@ lws_client_connect_2(struct lws *wsi)
lws_libuv_accept(wsi, wsi->desc);
lws_libevent_accept(wsi, wsi->desc);
if (insert_wsi_socket_into_fds(context, wsi)) {
if (__insert_wsi_socket_into_fds(context, wsi)) {
compatible_close(wsi->desc.sockfd);
cce = "insert wsi failed";
goto oom4;
@ -502,7 +502,7 @@ lws_client_reset(struct lws **pwsi, int ssl, const char *address, int port,
compatible_close(wsi->desc.sockfd);
#endif
remove_wsi_socket_from_fds(wsi);
__remove_wsi_socket_from_fds(wsi);
#ifdef LWS_OPENSSL_SUPPORT
wsi->use_ssl = ssl;

View file

@ -952,7 +952,7 @@ lws_create_event_pipes(struct lws_context *context)
lws_libev_accept(wsi, wsi->desc);
lws_libevent_accept(wsi, wsi->desc);
if (insert_wsi_socket_into_fds(context, wsi))
if (__insert_wsi_socket_into_fds(context, wsi))
return 1;
lws_change_pollfd(context->pt[n].pipe_wsi, 0, LWS_POLLIN);
@ -966,7 +966,7 @@ static void
lws_destroy_event_pipe(struct lws *wsi)
{
lws_plat_pipe_close(wsi);
remove_wsi_socket_from_fds(wsi);
__remove_wsi_socket_from_fds(wsi);
lws_libevent_destroy(wsi);
wsi->context->count_wsi_allocated--;
lws_free(wsi);

View file

@ -487,6 +487,7 @@ lws_libuv_closewsi(uv_handle_t* handle)
struct lws *n = NULL, *wsi = (struct lws *)(((char *)handle) -
(char *)(&n->w_read.uv_watcher));
struct lws_context *context = lws_get_context(wsi);
struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
int lspd = 0;
if (wsi->mode == LWSCM_SERVER_LISTENER &&
@ -497,7 +498,9 @@ lws_libuv_closewsi(uv_handle_t* handle)
lspd = 2;
}
lws_close_free_wsi_final(wsi);
lws_pt_lock(pt, __func__);
__lws_close_free_wsi_final(wsi);
lws_pt_unlock(pt);
if (lspd == 2 && context->deprecation_cb) {
lwsl_notice("calling deprecation callback\n");

View file

@ -59,14 +59,14 @@ static const char * const log_level_names[] = {
#endif
void
lws_free_wsi(struct lws *wsi)
__lws_free_wsi(struct lws *wsi)
{
struct lws_context_per_thread *pt;
struct allocated_headers *ah;
if (!wsi)
return;
pt = &wsi->context->pt[(int)wsi->tsi];
/*
@ -85,12 +85,11 @@ lws_free_wsi(struct lws *wsi)
lwsl_info("ah det due to close\n");
/* we're closing, losing some rx is OK */
lws_header_table_force_to_detachable_state(wsi);
lws_header_table_detach(wsi, 0);
__lws_header_table_detach(wsi, 0);
if (wsi->vhost && wsi->vhost->lserv_wsi == wsi)
wsi->vhost->lserv_wsi = NULL;
lws_pt_lock(pt, __func__);
ah = pt->ah_list;
while (ah) {
if (ah->in_use && ah->wsi == wsi) {
@ -124,8 +123,6 @@ lws_free_wsi(struct lws *wsi)
#endif
__lws_remove_from_timeout_list(wsi);
lws_pt_unlock(pt);
lws_libevent_destroy(wsi);
wsi->context->count_wsi_allocated--;
@ -189,17 +186,17 @@ __lws_add_to_timeout_list(struct lws *wsi)
*wsi->timeout_list_prev = wsi;
}
LWS_VISIBLE void
lws_set_timer(struct lws *wsi, int secs)
void
__lws_set_timer(struct lws *wsi, int secs)
{
struct lws_context_per_thread *pt = &wsi->context->pt[(int)wsi->tsi];
// struct lws_context_per_thread *pt = &wsi->context->pt[(int)wsi->tsi];
time_t now;
if (secs < 0) {
wsi->timer_active = 0;
if (!lws_should_be_on_timeout_list(wsi))
lws_remove_from_timeout_list(wsi);
__lws_remove_from_timeout_list(wsi);
return;
}
@ -211,14 +208,21 @@ lws_set_timer(struct lws *wsi, int secs)
if (!wsi->timer_active) {
wsi->timer_active = 1;
if (!wsi->pending_timeout) {
lws_pt_lock(pt, __func__);
if (!wsi->pending_timeout)
__lws_add_to_timeout_list(wsi);
lws_pt_unlock(pt);
}
}
}
LWS_VISIBLE void
lws_set_timer(struct lws *wsi, int secs)
{
//struct lws_context_per_thread *pt = &wsi->context->pt[(int)wsi->tsi];
// lws_pt_lock(pt, __func__);
__lws_set_timer(wsi, secs);
// lws_pt_unlock(pt);
}
void
__lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs)
{
@ -377,7 +381,7 @@ lws_bind_protocol(struct lws *wsi, const struct lws_protocols *p)
}
void
lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason, const char *caller)
__lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason, const char *caller)
{
struct lws_context_per_thread *pt;
struct lws *wsi1, *wsi2;
@ -486,7 +490,7 @@ lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason, const char *ca
if (wsi->mode == LWSCM_RAW_FILEDESC) {
lws_remove_child_from_any_parent(wsi);
remove_wsi_socket_from_fds(wsi);
__remove_wsi_socket_from_fds(wsi);
wsi->protocol->callback(wsi,
LWS_CALLBACK_RAW_CLOSE_FILE,
wsi->user_space, NULL, 0);
@ -772,12 +776,12 @@ just_kill_connection:
* we won't be servicing or receiving anything further from this guy
* delete socket from the internal poll list if still present
*/
lws_ssl_remove_wsi_from_buffered_list(wsi);
lws_remove_from_timeout_list(wsi);
__lws_ssl_remove_wsi_from_buffered_list(wsi);
__lws_remove_from_timeout_list(wsi);
/* checking return redundant since we anyway close */
if (wsi->desc.sockfd != LWS_SOCK_INVALID)
remove_wsi_socket_from_fds(wsi);
__remove_wsi_socket_from_fds(wsi);
else
lws_same_vh_protocol_remove(wsi);
@ -875,11 +879,11 @@ async_close:
}
#endif
lws_close_free_wsi_final(wsi);
__lws_close_free_wsi_final(wsi);
}
void
lws_close_free_wsi_final(struct lws *wsi)
__lws_close_free_wsi_final(struct lws *wsi)
{
int n;
@ -916,7 +920,18 @@ lws_close_free_wsi_final(struct lws *wsi)
}
#endif
lws_free_wsi(wsi);
__lws_free_wsi(wsi);
}
void
lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason, const char *caller)
{
struct lws_context_per_thread *pt = &wsi->context->pt[(int)wsi->tsi];
lws_pt_lock(pt, __func__);
__lws_close_free_wsi(wsi, reason, caller);
lws_pt_unlock(pt);
}
LWS_VISIBLE LWS_EXTERN const char *

View file

@ -217,6 +217,9 @@ _lws_plat_service_tsi(struct lws_context *context, int timeout_ms, int tsi)
* list on the pt. Drain the list and apply the changes to the
* affected pollfds in the correct order.
*/
lws_pt_lock(pt, __func__);
ftp = vpt->foreign_pfd_list;
//lwsl_notice("cleared list %p\n", ftp);
while (ftp) {
@ -228,7 +231,7 @@ _lws_plat_service_tsi(struct lws_context *context, int timeout_ms, int tsi)
if (lws_sockfd_valid(pfd->fd)) {
wsi = wsi_from_fd(context, pfd->fd);
if (wsi)
lws_change_pollfd(wsi, ftp->_and, ftp->_or);
__lws_change_pollfd(wsi, ftp->_and, ftp->_or);
}
lws_free((void *)ftp);
ftp = next;
@ -236,6 +239,8 @@ _lws_plat_service_tsi(struct lws_context *context, int timeout_ms, int tsi)
vpt->foreign_pfd_list = NULL;
lws_memory_barrier();
lws_pt_unlock(pt);
#ifdef LWS_OPENSSL_SUPPORT
if (!n && !pt->rx_draining_ext_list &&
!lws_ssl_anybody_has_buffered_read_tsi(context, tsi)) {

View file

@ -220,7 +220,7 @@ lws_accept_modulation(struct lws_context_per_thread *pt, int allow)
#endif
int
insert_wsi_socket_into_fds(struct lws_context *context, struct lws *wsi)
__insert_wsi_socket_into_fds(struct lws_context *context, struct lws *wsi)
{
struct lws_pollargs pa = { wsi->desc.sockfd, LWS_POLLIN, 0 };
struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
@ -253,7 +253,6 @@ insert_wsi_socket_into_fds(struct lws_context *context, struct lws *wsi)
wsi->user_space, (void *) &pa, 1))
return -1;
lws_pt_lock(pt, __func__);
pt->count_conns++;
insert_wsi(context, wsi);
wsi->position_in_fds_table = pt->fds_count;
@ -278,7 +277,6 @@ insert_wsi_socket_into_fds(struct lws_context *context, struct lws *wsi)
if ((unsigned int)pt->fds_count == context->fd_limit_per_thread - 1)
lws_accept_modulation(pt, 0);
#endif
lws_pt_unlock(pt);
if (wsi->vhost &&
wsi->vhost->protocols[0].callback(wsi, LWS_CALLBACK_UNLOCK_POLL,
@ -289,7 +287,7 @@ insert_wsi_socket_into_fds(struct lws_context *context, struct lws *wsi)
}
int
remove_wsi_socket_from_fds(struct lws *wsi)
__remove_wsi_socket_from_fds(struct lws *wsi)
{
struct lws_context *context = wsi->context;
struct lws_pollargs pa = { wsi->desc.sockfd, 0, 0 };
@ -326,8 +324,6 @@ remove_wsi_socket_from_fds(struct lws *wsi)
lws_libuv_io(wsi, LWS_EV_STOP | LWS_EV_READ | LWS_EV_WRITE |
LWS_EV_PREPARE_DELETION);
lws_pt_lock(pt, __func__);
lwsl_debug("%s: wsi=%p, sock=%d, fds pos=%d, end guy pos=%d, endfd=%d\n",
__func__, wsi, wsi->desc.sockfd, wsi->position_in_fds_table,
pt->fds_count, pt->fds[pt->fds_count].fd);
@ -363,7 +359,6 @@ remove_wsi_socket_from_fds(struct lws *wsi)
(unsigned int)pt->fds_count < context->fd_limit_per_thread - 1)
lws_accept_modulation(pt, 1);
#endif
lws_pt_unlock(pt);
if (wsi->vhost &&
wsi->vhost->protocols[0].callback(wsi, LWS_CALLBACK_UNLOCK_POLL,

View file

@ -1191,7 +1191,7 @@ lws_check_deferred_free(struct lws_context *context, int force);
#define lws_get_vh_protocol(vh, x) vh->protocols[x]
LWS_EXTERN void
lws_close_free_wsi_final(struct lws *wsi);
__lws_close_free_wsi_final(struct lws *wsi);
LWS_EXTERN void
lws_libuv_closehandle(struct lws *wsi);
LWS_EXTERN void
@ -2035,12 +2035,14 @@ lws_get_addr_scope(const char *ipaddr);
LWS_EXTERN void
lws_close_free_wsi(struct lws *wsi, enum lws_close_status, const char *caller);
LWS_EXTERN void
__lws_close_free_wsi(struct lws *wsi, enum lws_close_status, const char *caller);
LWS_EXTERN void
lws_free_wsi(struct lws *wsi);
__lws_free_wsi(struct lws *wsi);
LWS_EXTERN int
remove_wsi_socket_from_fds(struct lws *wsi);
__remove_wsi_socket_from_fds(struct lws *wsi);
LWS_EXTERN int
lws_rxflow_cache(struct lws *wsi, unsigned char *buf, int n, int len);
@ -2104,15 +2106,11 @@ delete_from_fd(struct lws_context *context, lws_sockfd_type fd);
#endif
LWS_EXTERN int LWS_WARN_UNUSED_RESULT
insert_wsi_socket_into_fds(struct lws_context *context, struct lws *wsi);
__insert_wsi_socket_into_fds(struct lws_context *context, struct lws *wsi);
LWS_EXTERN int LWS_WARN_UNUSED_RESULT
lws_issue_raw(struct lws *wsi, unsigned char *buf, size_t len);
LWS_EXTERN int LWS_WARN_UNUSED_RESULT
lws_service_timeout_check(struct lws *wsi, time_t sec);
LWS_EXTERN void
lws_remove_from_timeout_list(struct lws *wsi);
@ -2255,6 +2253,8 @@ lws_header_table_attach(struct lws *wsi, int autoservice);
LWS_EXTERN int
lws_header_table_detach(struct lws *wsi, int autoservice);
LWS_EXTERN int
__lws_header_table_detach(struct lws *wsi, int autoservice);
LWS_EXTERN void
lws_header_table_reset(struct lws *wsi, int autoservice);
@ -2322,6 +2322,7 @@ LWS_EXTERN void lwsl_emit_stderr(int level, const char *line);
#define lws_ssl_context_destroy(_a)
#define lws_ssl_SSL_CTX_destroy(_a)
#define lws_ssl_remove_wsi_from_buffered_list(_a)
#define __lws_ssl_remove_wsi_from_buffered_list(_a)
#define lws_context_init_ssl_library(_a)
#define lws_ssl_anybody_has_buffered_read_tsi(_a, _b) (0)
#define lws_tls_check_all_cert_lifetimes(_a)
@ -2353,6 +2354,8 @@ LWS_EXTERN void
lws_ssl_SSL_CTX_destroy(struct lws_vhost *vhost);
LWS_EXTERN void
lws_ssl_context_destroy(struct lws_context *context);
void
__lws_ssl_remove_wsi_from_buffered_list(struct lws *wsi);
LWS_VISIBLE void
lws_ssl_remove_wsi_from_buffered_list(struct lws *wsi);
LWS_EXTERN int
@ -2772,8 +2775,6 @@ lws_peer_add_wsi(struct lws_context *context, struct lws_peer *peer,
void
__lws_remove_from_timeout_list(struct lws *wsi);
void
__lws_ssl_remove_wsi_from_buffered_list(struct lws *wsi);
void
__lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs);
int
__lws_change_pollfd(struct lws *wsi, int _and, int _or);

View file

@ -164,7 +164,7 @@ lws_cgi(struct lws *wsi, const char * const *exec_array, int script_uri_path_len
for (n = 0; n < 3; n++) {
lws_libuv_accept(cgi->stdwsi[n], cgi->stdwsi[n]->desc);
if (insert_wsi_socket_into_fds(wsi->context, cgi->stdwsi[n]))
if (__insert_wsi_socket_into_fds(wsi->context, cgi->stdwsi[n]))
goto bail3;
cgi->stdwsi[n]->parent = wsi;
cgi->stdwsi[n]->sibling_list = wsi->child_list;
@ -446,11 +446,11 @@ bail3:
pt->cgi_list = cgi->cgi_list;
while (--n >= 0)
remove_wsi_socket_from_fds(wsi->cgi->stdwsi[n]);
__remove_wsi_socket_from_fds(wsi->cgi->stdwsi[n]);
bail2:
for (n = 0; n < 3; n++)
if (wsi->cgi->stdwsi[n])
lws_free_wsi(cgi->stdwsi[n]);
__lws_free_wsi(cgi->stdwsi[n]);
bail1:
for (n = 0; n < 3; n++) {

View file

@ -339,7 +339,7 @@ lws_header_table_is_in_detachable_state(struct lws *wsi)
return ah && ah->rxpos == ah->rxlen && wsi->hdr_parsing_completed;
}
int lws_header_table_detach(struct lws *wsi, int autoservice)
int __lws_header_table_detach(struct lws *wsi, int autoservice)
{
struct lws_context *context = wsi->context;
struct allocated_headers *ah = wsi->ah;
@ -348,9 +348,7 @@ int lws_header_table_detach(struct lws *wsi, int autoservice)
struct lws **pwsi, **pwsi_eligible;
time_t now;
lws_pt_lock(pt, __func__);
__lws_remove_from_ah_waiting_list(wsi);
lws_pt_unlock(pt);
if (!ah)
return 0;
@ -372,8 +370,6 @@ int lws_header_table_detach(struct lws *wsi, int autoservice)
return 0;
}
lws_pt_lock(pt, __func__);
/* we did have an ah attached */
time(&now);
if (ah->assigned && now - ah->assigned > 3) {
@ -485,8 +481,6 @@ bail:
lwsl_info("%s: wsi %p: ah %p (tsi=%d, count = %d)\n", __func__,
(void *)wsi, (void *)ah, pt->tid, pt->ah_count_in_use);
lws_pt_unlock(pt);
return 0;
nobody_usable_waiting:
@ -497,6 +491,19 @@ nobody_usable_waiting:
goto bail;
}
int lws_header_table_detach(struct lws *wsi, int autoservice)
{
struct lws_context *context = wsi->context;
struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
int n;
lws_pt_lock(pt, __func__);
n = __lws_header_table_detach(wsi, autoservice);
lws_pt_unlock(pt);
return n;
}
LWS_VISIBLE int
lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx)
{

View file

@ -177,7 +177,7 @@ lws_context_init_server(struct lws_context_creation_info *info,
lws_uv_initvhost(vhost, wsi);
#endif
if (insert_wsi_socket_into_fds(vhost->context, wsi))
if (__insert_wsi_socket_into_fds(vhost->context, wsi))
goto bail;
vhost->context->count_wsi_allocated++;
@ -189,7 +189,7 @@ lws_context_init_server(struct lws_context_creation_info *info,
lwsl_err("listen failed with error %d\n", LWS_ERRNO);
vhost->lserv_wsi = NULL;
vhost->context->count_wsi_allocated--;
remove_wsi_socket_from_fds(wsi);
__remove_wsi_socket_from_fds(wsi);
goto bail;
}
} /* for each thread able to independently listen */
@ -402,7 +402,7 @@ lws_http_serve(struct lws *wsi, char *uri, const char *origin,
wsi->http.fop_fd = fops->LWS_FOP_OPEN(wsi->context->fops,
path, vpath, &fflags);
if (!wsi->http.fop_fd) {
lwsl_err("Unable to open '%s'\n", path);
lwsl_err("Unable to open '%s': errno %d\n", path, errno);
return -1;
}
@ -2096,10 +2096,13 @@ lws_adopt_descriptor_vhost(struct lws_vhost *vh, lws_adoption_type type,
lws_libevent_accept(new_wsi, new_wsi->desc);
if (!ssl) {
if (insert_wsi_socket_into_fds(context, new_wsi)) {
lws_pt_lock(pt, __func__);
if (__insert_wsi_socket_into_fds(context, new_wsi)) {
lws_pt_unlock(pt);
lwsl_err("%s: fail inserting socket\n", __func__);
goto fail;
}
lws_pt_unlock(pt);
} else
if (lws_server_socket_service_ssl(new_wsi, fd.sockfd)) {
lwsl_info("%s: fail ssl negotiation\n", __func__);
@ -2340,6 +2343,7 @@ lws_server_socket_service(struct lws_context *context, struct lws *wsi,
ah->rxlen = lws_ssl_capable_read(wsi, ah->rx,
sizeof(ah->rx));
}
ah->rxpos = 0;
switch (ah->rxlen) {
case 0:
@ -2347,8 +2351,9 @@ lws_server_socket_service(struct lws_context *context, struct lws *wsi,
__func__);
wsi->seen_zero_length_recv = 1;
lws_change_pollfd(wsi, LWS_POLLIN, 0);
goto try_pollout;
/* fallthru */
// goto try_pollout;
goto fail;
case LWS_SSL_CAPABLE_ERROR:
goto fail;
case LWS_SSL_CAPABLE_MORE_SERVICE:
@ -2742,7 +2747,7 @@ lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type,
wsi->http.fop_fd = fops->LWS_FOP_OPEN(wsi->context->fops,
file, vpath, &fflags);
if (!wsi->http.fop_fd) {
lwsl_err("Unable to open '%s'\n", file);
lwsl_err("Unable to open '%s': errno %d\n", file, errno);
return -1;
}

View file

@ -161,10 +161,12 @@ lws_server_socket_service_ssl(struct lws *wsi, lws_sockfd_type accept_fd)
else
wsi->mode = LWSCM_SSL_ACK_PENDING_RAW;
if (insert_wsi_socket_into_fds(context, wsi)) {
lws_pt_lock(pt, __func__);
if (__insert_wsi_socket_into_fds(context, wsi)) {
lwsl_err("%s: failed to insert into fds\n", __func__);
goto fail;
}
lws_pt_unlock(pt);
lws_set_timeout(wsi, PENDING_TIMEOUT_SSL_ACCEPT,
context->timeout_secs);

View file

@ -611,8 +611,8 @@ bail_die:
return -1;
}
int
lws_service_timeout_check(struct lws *wsi, time_t sec)
static int
__lws_service_timeout_check(struct lws *wsi, time_t sec)
{
struct lws_context_per_thread *pt = &wsi->context->pt[(int)wsi->tsi];
int n = 0;
@ -638,13 +638,14 @@ lws_service_timeout_check(struct lws *wsi, time_t sec)
if (wsi->protocol &&
wsi->protocol->callback(wsi, LWS_CALLBACK_TIMER,
wsi->user_space, NULL, 0)) {
lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "timer cb errored");
lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS,
"timer cb errored");
return 1;
}
if (!lws_should_be_on_timeout_list(wsi)) {
lws_remove_from_timeout_list(wsi);
__lws_remove_from_timeout_list(wsi);
return 0;
}
@ -656,7 +657,7 @@ lws_service_timeout_check(struct lws *wsi, time_t sec)
*/
if (wsi->pending_timeout &&
lws_compare_time_t(wsi->context, sec, wsi->pending_timeout_set) >
wsi->pending_timeout_limit) {
wsi->pending_timeout_limit) {
if (wsi->desc.sockfd != LWS_SOCK_INVALID &&
wsi->position_in_fds_table >= 0)
@ -693,7 +694,7 @@ lws_service_timeout_check(struct lws *wsi, time_t sec)
wsi->user_space,
(void *)"Timed out waiting SSL", 21);
lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "timeout");
__lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "timeout");
return 1;
}
@ -850,7 +851,7 @@ lws_service_flag_pending(struct lws_context *context, int tsi)
* at the end of the service, he'll get put back on the
* list then.
*/
lws_ssl_remove_wsi_from_buffered_list(wsi);
__lws_ssl_remove_wsi_from_buffered_list(wsi);
}
wsi = wsi_next;
@ -1133,12 +1134,13 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
* Phase 1: check every wsi on the timeout check list
*/
lws_pt_lock(pt, __func__);
wsi = context->pt[tsi].timeout_list;
while (wsi) {
/* we have to take copies, because he may be deleted */
wsi1 = wsi->timeout_list;
tmp_fd = wsi->desc.sockfd;
if (lws_service_timeout_check(wsi, now)) {
if (__lws_service_timeout_check(wsi, now)) {
/* he did time out... */
if (tmp_fd == our_fd)
/* it was the guy we came to service! */
@ -1221,11 +1223,13 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
/* it was the guy we came to service! */
timed_out = 1;
lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "excessive ah");
__lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "excessive ah");
ah = pt->ah_list;
}
lws_pt_unlock(pt);
#ifdef LWS_WITH_CGI
/*
* Phase 3: handle cgi timeouts
@ -1430,6 +1434,7 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
case LWSCM_SERVER_LISTENER:
case LWSCM_SSL_ACK_PENDING:
case LWSCM_SSL_ACK_PENDING_RAW:
if (wsi->state == LWSS_CLIENT_HTTP_ESTABLISHED)
goto handled;
@ -1668,7 +1673,7 @@ read:
eff_buf.token_len);
switch (eff_buf.token_len) {
case 0:
lwsl_info("%s: zero length read\n",
lwsl_notice("%s: zero length read\n",
__func__);
goto close_and_handled;
case LWS_SSL_CAPABLE_MORE_SERVICE:

View file

@ -345,6 +345,7 @@ int main(int argc, char **argv)
info.count_threads = threads;
info.extensions = exts;
info.max_http_header_pool = 4;
info.pt_serv_buf_size = 128 * 1024;
/* when doing slow benchmarks with thousands of concurrent
* connections, we need wait longer