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

cleanups after api changes and mbed update

Signed-off-by: Andy Green <andy.green@linaro.org>
This commit is contained in:
Andy Green 2015-12-04 16:54:12 +08:00
parent 9c9f2180f3
commit dc6e47cafc
3 changed files with 96 additions and 141 deletions

View file

@ -91,9 +91,9 @@ lws_create_context(struct lws_context_creation_info *info)
lwsl_notice("IPV6 compiled in but disabled\n");
#else
lwsl_notice("IPV6 not compiled in\n");
#endif
#endif
lws_feature_status_libev(info);
#endif
lwsl_info(" LWS_MAX_HEADER_LEN: %u\n", LWS_MAX_HEADER_LEN);
lwsl_info(" LWS_MAX_PROTOCOLS: %u\n", LWS_MAX_PROTOCOLS);
@ -148,21 +148,13 @@ lws_create_context(struct lws_context_creation_info *info)
/* to reduce this allocation, */
context->max_fds = getdtablesize();
lwsl_notice(" static allocation: %u + (%u x %u fds) = %u bytes\n",
sizeof(struct lws_context),
sizeof(struct lws_pollfd) +
sizeof(struct lws *),
context->max_fds,
sizeof(struct lws_context) +
((sizeof(struct lws_pollfd) +
sizeof(struct lws *)) *
context->max_fds));
lwsl_notice(" ctx mem: %u bytes\n", sizeof(struct lws_context) +
((sizeof(struct lws_pollfd) + sizeof(struct lws *)) *
context->max_fds));
context->fds = lws_zalloc(sizeof(struct lws_pollfd) *
context->max_fds);
context->fds = lws_zalloc(sizeof(struct lws_pollfd) * context->max_fds);
if (context->fds == NULL) {
lwsl_err("Unable to allocate fds array for %d connections\n",
context->max_fds);
lwsl_err("OOM allocating %d fds\n", context->max_fds);
goto bail;
}
@ -195,10 +187,8 @@ lws_create_context(struct lws_context_creation_info *info)
#endif
}
lwsl_notice(
" per-conn mem: %u + %u headers + protocol rx buf\n",
sizeof(struct lws),
sizeof(struct allocated_headers));
lwsl_notice(" per-conn mem: %u + %u headers + protocol rx buf\n",
sizeof(struct lws), sizeof(struct allocated_headers));
if (lws_context_init_server_ssl(info, context))
goto bail;
@ -219,12 +209,8 @@ lws_create_context(struct lws_context_creation_info *info)
/* initialize supported protocols */
for (context->count_protocols = 0;
info->protocols[context->count_protocols].callback;
context->count_protocols++) {
// lwsl_notice(" Protocol: %s\n",
// info->protocols[context->count_protocols].name);
info->protocols[context->count_protocols].callback;
context->count_protocols++) {
info->protocols[context->count_protocols].owning_server =
context;
info->protocols[context->count_protocols].protocol_index =
@ -242,16 +228,13 @@ lws_create_context(struct lws_context_creation_info *info)
* give all extensions a chance to create any per-context
* allocations they need
*/
if (info->port != CONTEXT_PORT_NO_LISTEN) {
if (lws_ext_callback_for_each_extension_type(context, NULL,
LWS_EXT_CALLBACK_SERVER_CONTEXT_CONSTRUCT,
NULL, 0) < 0)
LWS_EXT_CALLBACK_SERVER_CONTEXT_CONSTRUCT, NULL, 0) < 0)
goto bail;
} else
if (lws_ext_callback_for_each_extension_type(context, NULL,
LWS_EXT_CALLBACK_CLIENT_CONTEXT_CONSTRUCT,
NULL, 0) < 0)
LWS_EXT_CALLBACK_CLIENT_CONTEXT_CONSTRUCT, NULL, 0) < 0)
goto bail;
return context;
@ -272,10 +255,8 @@ bail:
LWS_VISIBLE void
lws_context_destroy(struct lws_context *context)
{
/* Note that this is used for freeing partially allocated structs as well
* so make sure you don't try to free something uninitialized */
int n;
struct lws_protocols *protocol = NULL;
int n;
lwsl_notice("%s\n", __func__);
@ -288,12 +269,12 @@ lws_context_destroy(struct lws_context *context)
#endif
for (n = 0; n < context->fds_count; n++) {
struct lws *wsi =
wsi_from_fd(context, context->fds[n].fd);
struct lws *wsi = wsi_from_fd(context, context->fds[n].fd);
if (!wsi)
continue;
lws_close_and_free_session(context,
wsi, LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY /* no protocol close */);
lws_close_and_free_session(context, wsi,
LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY
/* no protocol close */);
n--;
}
@ -301,20 +282,12 @@ lws_context_destroy(struct lws_context *context)
* give all extensions a chance to clean up any per-context
* allocations they might have made
*/
// TODO: I am not sure, but are we never supposed to be able to run a server
// and client at the same time for a given context?
// Otherwise both of these callbacks should always be called!
if (context->listen_port != CONTEXT_PORT_NO_LISTEN) {
if (lws_ext_callback_for_each_extension_type(context, NULL,
LWS_EXT_CALLBACK_SERVER_CONTEXT_DESTRUCT, NULL, 0) < 0) {
lwsl_err("Got error from server extension callback on cleanup");
}
} else {
if (lws_ext_callback_for_each_extension_type(context, NULL,
LWS_EXT_CALLBACK_CLIENT_CONTEXT_DESTRUCT, NULL, 0) < 0) {
lwsl_err("Got error from client extension callback on cleanup");
}
}
n = lws_ext_callback_for_each_extension_type(context, NULL,
LWS_EXT_CALLBACK_SERVER_CONTEXT_DESTRUCT, NULL, 0);
n = lws_ext_callback_for_each_extension_type(context, NULL,
LWS_EXT_CALLBACK_CLIENT_CONTEXT_DESTRUCT, NULL, 0);
/*
* inform all the protocols that they are done and will have no more
@ -323,8 +296,9 @@ lws_context_destroy(struct lws_context *context)
protocol = context->protocols;
if (protocol) {
while (protocol->callback) {
protocol->callback(context, NULL, LWS_CALLBACK_PROTOCOL_DESTROY,
NULL, NULL, 0);
protocol->callback(context, NULL,
LWS_CALLBACK_PROTOCOL_DESTROY,
NULL, NULL, 0);
protocol++;
}
}

View file

@ -44,18 +44,14 @@ lws_free_wsi(struct lws *wsi)
return;
/* Protocol user data may be allocated either internally by lws
* or by specified the user. Important we don't free external user data */
if (wsi->protocol && wsi->protocol->per_session_data_size
&& wsi->user_space && !wsi->user_space_externally_allocated) {
* or by specified the user.
* We should only free what we allocated. */
if (wsi->protocol && wsi->protocol->per_session_data_size &&
wsi->user_space && !wsi->user_space_externally_allocated)
lws_free(wsi->user_space);
}
lws_free2(wsi->rxflow_buffer);
lws_free2(wsi->truncated_send_malloc);
// TODO: Probably should handle the union structs in wsi->u here depending
// on connection mode as well. Too spaghetti for me to follow however...
lws_free_header_table(wsi);
lws_free(wsi);
}
@ -64,17 +60,24 @@ void
lws_close_and_free_session(struct lws_context *context,
struct lws *wsi, enum lws_close_status reason)
{
int n, m, ret;
int old_state;
unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 2 +
LWS_SEND_BUFFER_POST_PADDING];
int n, m, ret, old_state;
struct lws_tokens eff_buf;
unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 2 +
LWS_SEND_BUFFER_POST_PADDING];
if (!wsi)
return;
old_state = wsi->state;
if (wsi->mode == LWS_CONNMODE_HTTP_SERVING_ACCEPTED &&
wsi->u.http.fd != LWS_INVALID_FILE) {
lwsl_debug("closing http file\n");
compatible_file_close(wsi->u.http.fd);
wsi->u.http.fd = LWS_INVALID_FILE;
context->protocols[0].callback(context, wsi,
LWS_CALLBACK_CLOSED_HTTP, wsi->user_space, NULL, 0);
}
if (wsi->socket_is_permanently_unusable ||
reason == LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY)
goto just_kill_connection;
@ -107,24 +110,13 @@ lws_close_and_free_session(struct lws_context *context,
wsi->u.ws.close_reason = reason;
if (wsi->mode == LWS_CONNMODE_WS_CLIENT_WAITING_CONNECT ||
wsi->mode == LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE)
wsi->mode == LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE)
goto just_kill_connection;
if (wsi->mode == LWS_CONNMODE_HTTP_SERVING)
context->protocols[0].callback(context, wsi,
LWS_CALLBACK_CLOSED_HTTP, wsi->user_space, NULL, 0);
if (wsi->mode == LWS_CONNMODE_HTTP_SERVING_ACCEPTED) {
if (wsi->u.http.fd != LWS_INVALID_FILE) {
// TODO: If we're just closing with LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY this file descriptor might leak?
lwsl_debug("closing http file\n");
compatible_file_close(wsi->u.http.fd);
wsi->u.http.fd = LWS_INVALID_FILE;
context->protocols[0].callback(context, wsi,
LWS_CALLBACK_CLOSED_HTTP, wsi->user_space, NULL, 0);
}
}
/*
* are his extensions okay with him closing? Eg he might be a mux
* parent and just his ch1 aspect is closing?
@ -165,7 +157,8 @@ lws_close_and_free_session(struct lws_context *context,
if (eff_buf.token_len)
if (lws_issue_raw(wsi, (unsigned char *)eff_buf.token,
eff_buf.token_len) != eff_buf.token_len) {
eff_buf.token_len) !=
eff_buf.token_len) {
lwsl_debug("close: ext spill failed\n");
goto just_kill_connection;
}
@ -191,25 +184,20 @@ lws_close_and_free_session(struct lws_context *context,
/* make valgrind happy */
memset(buf, 0, sizeof(buf));
n = lws_write(wsi,
&buf[LWS_SEND_BUFFER_PRE_PADDING + 2],
0, LWS_WRITE_CLOSE);
n = lws_write(wsi, &buf[LWS_SEND_BUFFER_PRE_PADDING + 2],
0, LWS_WRITE_CLOSE);
if (n >= 0) {
/*
* we have sent a nice protocol level indication we
* now wish to close, we should not send anything more
*/
wsi->state = WSI_STATE_AWAITING_CLOSE_ACK;
/*
* ...and we should wait for a reply for a bit
* out of politeness
*/
lws_set_timeout(wsi,
PENDING_TIMEOUT_CLOSE_ACK, 1);
lws_set_timeout(wsi, PENDING_TIMEOUT_CLOSE_ACK, 1);
lwsl_debug("sent close indication, awaiting ack\n");
return;
@ -228,10 +216,9 @@ 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(context, wsi);
// checking return redundant since we anyway close
/* checking return redundant since we anyway close */
remove_wsi_socket_from_fds(context, wsi);
wsi->state = WSI_STATE_DEAD_SOCKET;
@ -245,11 +232,10 @@ just_kill_connection:
lws_free2(wsi->u.ws.rx_user_buffer);
if (wsi->truncated_send_malloc) {
if (wsi->truncated_send_malloc)
/* not going to be completed... nuke it */
lws_free2(wsi->truncated_send_malloc);
wsi->truncated_send_len = 0;
}
if (wsi->u.ws.ping_payload_buf) {
lws_free2(wsi->u.ws.ping_payload_buf);
wsi->u.ws.ping_payload_alloc = 0;
@ -261,13 +247,13 @@ just_kill_connection:
/* tell the user it's all over for this guy */
if (wsi->protocol && wsi->protocol->callback &&
((old_state == WSI_STATE_ESTABLISHED) ||
(old_state == WSI_STATE_RETURNED_CLOSE_ALREADY) ||
(old_state == WSI_STATE_AWAITING_CLOSE_ACK) ||
(old_state == WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE))) {
((old_state == WSI_STATE_ESTABLISHED) ||
(old_state == WSI_STATE_RETURNED_CLOSE_ALREADY) ||
(old_state == WSI_STATE_AWAITING_CLOSE_ACK) ||
(old_state == WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE))) {
lwsl_debug("calling back CLOSED\n");
wsi->protocol->callback(context, wsi, LWS_CALLBACK_CLOSED,
wsi->user_space, NULL, 0);
wsi->user_space, NULL, 0);
} else if (wsi->mode == LWS_CONNMODE_HTTP_SERVING_ACCEPTED) {
lwsl_debug("calling back CLOSED_HTTP\n");
context->protocols[0].callback(context, wsi,
@ -276,15 +262,16 @@ just_kill_connection:
wsi->mode == LWS_CONNMODE_WS_CLIENT_WAITING_CONNECT) {
lwsl_debug("Connection closed before server reply\n");
context->protocols[0].callback(context, wsi,
LWS_CALLBACK_CLIENT_CONNECTION_ERROR,
wsi->user_space, NULL, 0 );
LWS_CALLBACK_CLIENT_CONNECTION_ERROR,
wsi->user_space, NULL, 0);
} else
lwsl_debug("not calling back closed mode=%d state=%d\n",
wsi->mode, old_state);
/* deallocate any active extension contexts */
if (lws_ext_callback_for_each_active(wsi, LWS_EXT_CALLBACK_DESTROY, NULL, 0) < 0)
if (lws_ext_callback_for_each_active(wsi, LWS_EXT_CALLBACK_DESTROY,
NULL, 0) < 0)
lwsl_warn("extension destruction failed\n");
#ifndef LWS_NO_EXTENSIONS
for (n = 0; n < wsi->count_active_extensions; n++)
@ -298,8 +285,6 @@ just_kill_connection:
LWS_EXT_CALLBACK_DESTROY_ANY_WSI_CLOSING, NULL, 0) < 0)
lwsl_warn("ext destroy wsi failed\n");
/* lwsl_info("closing fd=%d\n", wsi->sock); */
if (!lws_ssl_close(wsi) && lws_socket_is_valid(wsi->sock)) {
#if LWS_POSIX
n = shutdown(wsi->sock, SHUT_RDWR);
@ -317,8 +302,8 @@ just_kill_connection:
}
/* outermost destroy notification for wsi (user_space still intact) */
context->protocols[0].callback(context, wsi,
LWS_CALLBACK_WSI_DESTROY, wsi->user_space, NULL, 0);
context->protocols[0].callback(context, wsi, LWS_CALLBACK_WSI_DESTROY,
wsi->user_space, NULL, 0);
lws_free_wsi(wsi);
}
@ -495,12 +480,11 @@ lws_context_user(struct lws_context *context)
*/
LWS_VISIBLE int
lws_callback_all_protocol(
const struct lws_protocols *protocol, int reason)
lws_callback_all_protocol(const struct lws_protocols *protocol, int reason)
{
struct lws_context *context = protocol->owning_server;
int n;
struct lws *wsi;
int n;
for (n = 0; n < context->fds_count; n++) {
wsi = wsi_from_fd(context, context->fds[n].fd);
@ -508,7 +492,7 @@ lws_callback_all_protocol(
continue;
if (wsi->protocol == protocol)
protocol->callback(context, wsi,
reason, wsi->user_space, NULL, 0);
reason, wsi->user_space, NULL, 0);
}
return 0;
@ -525,8 +509,7 @@ lws_callback_all_protocol(
*/
LWS_VISIBLE void
lws_set_timeout(struct lws *wsi,
enum pending_timeout reason, int secs)
lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs)
{
time_t now;
@ -615,7 +598,7 @@ lws_rx_flow_control(struct lws *wsi, int enable)
if (enable == (wsi->rxflow_change_to & LWS_RXFLOW_ALLOW))
return 0;
lwsl_info("lws_rx_flow_control(0x%p, %d)\n", wsi, enable);
lwsl_info("%s: (0x%p, %d)\n", __func__, wsi, enable);
wsi->rxflow_change_to = LWS_RXFLOW_PENDING_CHANGE | !!enable;
return 0;
@ -794,28 +777,33 @@ lws_ensure_user_space(struct lws *wsi)
return 1;
}
} else
lwsl_info("%s: %p protocol pss %u, user_space=%d\n", __func__, wsi, wsi->protocol->per_session_data_size, wsi->user_space);
lwsl_info("%s: %p protocol pss %u, user_space=%d\n",
__func__, wsi, wsi->protocol->per_session_data_size,
wsi->user_space);
return 0;
}
#if LWS_POSIX
LWS_VISIBLE void lwsl_emit_stderr(int level, const char *line)
{
char buf[300];
unsigned long long now;
char buf[300];
int n;
buf[0] = '\0';
for (n = 0; n < LLL_COUNT; n++)
if (level == (1 << n)) {
now = time_in_microseconds() / 100;
sprintf(buf, "[%llu:%04d] %s: ", (unsigned long long) now / 10000,
(int)(now % 10000), log_level_names[n]);
break;
}
for (n = 0; n < LLL_COUNT; n++) {
if (level != (1 << n))
continue;
now = time_in_microseconds() / 100;
sprintf(buf, "[%llu:%04d] %s: ",
(unsigned long long) now / 10000,
(int)(now % 10000), log_level_names[n]);
break;
}
fprintf(stderr, "%s%s", buf, line);
}
#endif
LWS_VISIBLE void _lws_logv(int filter, const char *format, va_list vl)
{
@ -851,12 +839,11 @@ LWS_VISIBLE void _lws_log(int filter, const char *format, ...)
*/
LWS_VISIBLE void lws_set_log_level(int level,
void (*log_emit_function)(int level,
const char *line))
void (*func)(int level, const char *line))
{
log_level = level;
if (log_emit_function)
lwsl_emit = log_emit_function;
if (func)
lwsl_emit = func;
}
/**
@ -997,10 +984,8 @@ libwebsocket_cancel_service(struct lws_context *context)
#ifdef LWS_USE_LIBEV
#undef libwebsocket_sigint_cfg
LWS_VISIBLE LWS_EXTERN int
libwebsocket_sigint_cfg(
struct lws_context *context,
int use_ev_sigint,
lws_ev_signal_cb* cb)
libwebsocket_sigint_cfg(struct lws_context *context, int use_ev_sigint,
lws_ev_signal_cb* cb)
{
return lws_sigint_cfg(context, use_ev_sigint, cb);
}

View file

@ -157,7 +157,7 @@ void lws_conn_listener::start(const uint16_t port)
srv.error_check(err);
}
int lws_conn::actual_onRX(Socket *s)
void lws_conn::onRX(Socket *s)
{
struct lws_pollfd pollfd;
@ -169,7 +169,7 @@ int lws_conn::actual_onRX(Socket *s)
lwsl_debug("%s: lws %p\n", __func__, wsi);
return lws_service_fd(wsi->protocol->owning_server, &pollfd);
lws_service_fd(wsi->protocol->owning_server, &pollfd);
}
/*
@ -204,13 +204,13 @@ void lws_conn_listener::onIncoming(TCPListener *tl, void *impl)
lws_server_socket_service(wsi->protocol->owning_server,
wsi, (struct pollfd *)conn);
conn->ts->setOnSent(Socket::SentHandler_t(conn, &lws_conn::onSent));
conn->ts->setOnReadable(TCPStream::ReadableHandler_t(conn, &lws_conn::onRX));
conn->ts->setOnError(TCPStream::ErrorHandler_t(conn, &lws_conn::onError));
conn->ts->setOnDisconnect(TCPStream::DisconnectHandler_t(conn,
&lws_conn::onDisconnect));
conn->ts->setOnSent(Socket::SentHandler_t(conn, &lws_conn::onSent));
conn->ts->setOnReadable(TCPStream::ReadableHandler_t(conn, &lws_conn::onRX));
conn->actual_onRX((Socket *)conn->ts);
conn->onRX((Socket *)conn->ts);
lwsl_debug("%s: exit\n", __func__);
}
@ -242,11 +242,6 @@ lws_plat_delete_socket_from_fds(struct lws_context *context,
(void)m;
}
void lws_conn::onRX(Socket *s)
{
actual_onRX(s);
}
void lws_conn_listener::onDisconnect(TCPStream *s)
{
lwsl_info("%s\r\n", __func__);
@ -272,7 +267,8 @@ void lws_conn::onSent(Socket *s, uint16_t len)
(void)len;
if (!awaiting_on_writeable) {
lwsl_debug("%s: wsi %p (setting writable=1)\r\n", __func__, (void *)wsi);
lwsl_debug("%s: wsi %p (setting writable=1)\r\n",
__func__, (void *)wsi);
writeable = 1;
return;
}
@ -298,6 +294,7 @@ void lws_conn_listener::onError(Socket *s, socket_error_t err)
void lws_conn::onDisconnect(TCPStream *s)
{
lwsl_notice("%s:\r\n", __func__);
(void)s;
lws_close_and_free_session(wsi->protocol->owning_server, wsi,
LWS_CLOSE_STATUS_NOSTATUS);
@ -308,6 +305,5 @@ void lws_conn::onError(Socket *s, socket_error_t err)
{
(void) s;
lwsl_notice("Socket Error: %s (%d)\r\n", socket_strerror(err), err);
if (ts)
ts->close();
}
s->close();
}