From 5da6f87a495a575c8f688db3903d3e76a5f65e4f Mon Sep 17 00:00:00 2001
From: Kim Alvefur <zash@zash.se>
Date: Fri, 2 Feb 2018 23:46:00 +0100
Subject: server_epoll: Rework how socket readyness is detected

---
 net/server_epoll.lua | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

(limited to 'net')

diff --git a/net/server_epoll.lua b/net/server_epoll.lua
index a88aad12..7aad9ede 100644
--- a/net/server_epoll.lua
+++ b/net/server_epoll.lua
@@ -505,9 +505,10 @@ function interface:init()
 	if self.tls and not self._tls then
 		return self:starttls();
 	else
-		self.onwriteable = interface.onconnect;
+		self.onwriteable = interface.onfirstwritable;
+		self.onreadable = interface.onfirstreadable;
 		self:setwritetimeout();
-		return self:setflags(false, true);
+		return self:setflags(true, true);
 	end
 end
 
@@ -537,15 +538,24 @@ end
 
 -- Connected!
 function interface:onconnect()
-	self.onwriteable = nil;
 	self:setflags(true, false);
-	if not self._connected then
-		self._connected = true;
-		self:on("connect");
-	end
+	self:on("connect");
+end
+
+function interface:onfirstwritable()
+	self.onreadable = nil;
+	self.onwriteable = nil;
+	self:onconnect();
 	return self:onwriteable();
 end
 
+function interface:onfirstreadable()
+	self.onreadable = nil;
+	self.onwriteable = nil;
+	self:onconnect();
+	return self:onreadable();
+end
+
 local function addserver(addr, port, listeners, pattern, tls)
 	local conn, err = socket.bind(addr, port, cfg.tcp_backlog);
 	if not conn then return conn, err; end
-- 
cgit v1.2.3