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

introduce api for unthrottle all connections of protocol

Signed-off-by: Andy Green <andy.green@linaro.org>
This commit is contained in:
Andy Green 2013-03-16 12:32:27 +08:00
parent 5c9fcacd7a
commit b55451c6d2
5 changed files with 63 additions and 13 deletions

View file

@ -20,6 +20,15 @@ User api additions
after the service call... if it's still nonzero, the descriptor
belongs to you and you need to take care of it.
- libwebsocket_rx_flow_allow_all_protocol(protocol) will unthrottle all
connections with the established protocol. It's designed to be
called from user server code when it sees it can accept more input
and may have throttled connections using the server rx flow apis
while it was unable to accept any other input The user server code
then does not have to try to track while connections it choked, this
will free up all of them in one call.
User api changes
----------------

View file

@ -1579,6 +1579,33 @@ libwebsocket_rx_flow_control(struct libwebsocket *wsi, int enable)
return 0;
}
/**
* libwebsocket_rx_flow_allow_all_protocol() - Allow all connections with this protocol to receive
*
* When the user server code realizes it can accept more input, it can
* call this to have the RX flow restriction removed from all connections using
* the given protocol.
*
* @protocol: all connections using this protocol will be allowed to receive
*/
void
libwebsocket_rx_flow_allow_all_protocol(
const struct libwebsocket_protocols *protocol)
{
struct libwebsocket_context *context = protocol->owning_server;
int n;
struct libwebsocket *wsi;
for (n = 0; n < context->fds_count; n++) {
wsi = context->lws_lookup[context->fds[n].fd];
if (!wsi)
continue;
if (wsi->protocol == protocol)
libwebsocket_rx_flow_control(wsi, LWS_RXFLOW_ALLOW);
}
}
/**
* libwebsocket_canonical_hostname() - returns this host's hostname

View file

@ -888,6 +888,10 @@ libwebsocket_get_reserved_bits(struct libwebsocket *wsi);
LWS_EXTERN int
libwebsocket_rx_flow_control(struct libwebsocket *wsi, int enable);
LWS_EXTERN void
libwebsocket_rx_flow_allow_all_protocol(
const struct libwebsocket_protocols *protocol);
LWS_EXTERN size_t
libwebsockets_remaining_packet_payload(struct libwebsocket *wsi);

View file

@ -273,6 +273,23 @@ If the output side of a server process becomes choked, this allows flow
control for the input side.
</blockquote>
<hr>
<h2>libwebsocket_rx_flow_allow_all_protocol - Allow all connections with this protocol to receive</h2>
<i>void</i>
<b>libwebsocket_rx_flow_allow_all_protocol</b>
(<i>const struct libwebsocket_protocols *</i> <b>protocol</b>)
<h3>Arguments</h3>
<dl>
<dt><b>protocol</b>
<dd>all connections using this protocol will be allowed to receive
</dl>
<h3>Description</h3>
<blockquote>
<p>
When the user server code realizes it can accept more input, it can
call this to have the RX flow restriction removed from all connections using
the given protocol.
</blockquote>
<hr>
<h2>libwebsocket_canonical_hostname - returns this host's hostname</h2>
<i>const char *</i>
<b>libwebsocket_canonical_hostname</b>

View file

@ -446,9 +446,6 @@ struct a_message {
static struct a_message ringbuffer[MAX_MESSAGE_QUEUE];
static int ringbuffer_head;
static struct libwebsocket *wsi_choked[20];
static int num_wsi_choked;
static int
callback_lws_mirror(struct libwebsocket_context *context,
struct libwebsocket *wsi,
@ -497,11 +494,10 @@ callback_lws_mirror(struct libwebsocket_context *context,
pss->ringbuffer_tail++;
if (((ringbuffer_head - pss->ringbuffer_tail) &
(MAX_MESSAGE_QUEUE - 1)) == (MAX_MESSAGE_QUEUE - 15)) {
for (n = 0; n < num_wsi_choked; n++)
libwebsocket_rx_flow_control(wsi_choked[n], 1);
num_wsi_choked = 0;
}
(MAX_MESSAGE_QUEUE - 1)) == (MAX_MESSAGE_QUEUE - 15))
libwebsocket_rx_flow_allow_all_protocol(
libwebsockets_get_protocol(wsi));
// lwsl_debug("tx fifo %d\n", (ringbuffer_head - pss->ringbuffer_tail) & (MAX_MESSAGE_QUEUE - 1));
if (lws_send_pipe_choked(wsi)) {
@ -543,11 +539,8 @@ callback_lws_mirror(struct libwebsocket_context *context,
goto done;
choke:
if (num_wsi_choked < sizeof wsi_choked / sizeof wsi_choked[0]) {
lwsl_debug("LWS_CALLBACK_RECEIVE: throttling %p\n", wsi);
libwebsocket_rx_flow_control(wsi, 0);
wsi_choked[num_wsi_choked++] = wsi;
}
lwsl_debug("LWS_CALLBACK_RECEIVE: throttling %p\n", wsi);
libwebsocket_rx_flow_control(wsi, 0);
// lwsl_debug("rx fifo %d\n", (ringbuffer_head - pss->ringbuffer_tail) & (MAX_MESSAGE_QUEUE - 1));
done: