From b3d21f164df44ed64a1b4c726eb534cd85cc2e7c Mon Sep 17 00:00:00 2001
From: Andy Green <andy.green@linaro.org>
Date: Fri, 25 Dec 2015 09:12:08 +0800
Subject: [PATCH] http header malloc pool allow listen accept flow control

Add a private api to enable and disable server listen socket POLLIN

Signed-off-by: Andy Green <andy.green@linaro.org>
---
 lib/private-libwebsockets.h |  6 ++++++
 lib/server.c                | 18 ++++++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h
index b8a9dceb..57dd9f92 100644
--- a/lib/private-libwebsockets.h
+++ b/lib/private-libwebsockets.h
@@ -536,6 +536,9 @@ struct lws_context {
 	void *user_space;
 
 	struct lws_plat_file_ops fops;
+#ifndef LWS_NO_SERVER
+	struct lws *wsi_listening;
+#endif
 };
 
 enum {
@@ -1220,10 +1223,13 @@ LWS_EXTERN int
 _lws_rx_flow_control(struct lws *wsi);
 LWS_EXTERN int
 lws_handshake_server(struct lws *wsi, unsigned char **buf, size_t len);
+LWS_EXTERN int
+_lws_server_listen_accept_flow_control(struct lws_context *context, int on);
 #else
 #define lws_server_socket_service(_a, _b, _c) (0)
 #define _lws_rx_flow_control(_a) (0)
 #define lws_handshake_server(_a, _b, _c) (0)
+#define _lws_server_listen_accept_flow_control(a, b) (0)
 #endif
 
 LWS_EXTERN int
diff --git a/lib/server.c b/lib/server.c
index 7e728f36..7fa1bdff 100644
--- a/lib/server.c
+++ b/lib/server.c
@@ -124,6 +124,7 @@ int lws_context_init_server(struct lws_context_creation_info *info,
 	wsi->mode = LWSCM_SERVER_LISTENER;
 	wsi->protocol = context->protocols;
 
+	context->wsi_listening = wsi;
 	if (insert_wsi_socket_into_fds(context, wsi))
 		goto bail;
 
@@ -181,6 +182,23 @@ _lws_rx_flow_control(struct lws *wsi)
 	return 0;
 }
 
+int
+_lws_server_listen_accept_flow_control(struct lws_context *context, int on)
+{
+	struct lws *wsi = context->wsi_listening;
+	int n;
+
+	if (!wsi)
+		return 0;
+
+	if (on)
+		n = lws_change_pollfd(wsi, 0, LWS_POLLIN);
+	else
+		n = lws_change_pollfd(wsi, LWS_POLLIN, 0);
+
+	return n;
+}
+
 int lws_http_action(struct lws *wsi)
 {
 	enum http_connection_type connection_type;
-- 
GitLab