server_epoll: Rework how socket readyness is detected
authorKim Alvefur <zash@zash.se>
Fri, 02 Feb 2018 23:46:00 +0100
changeset 8509 174fd716c9fa
parent 8508 c9bdb4dfed96
child 8510 71ef6d509105
server_epoll: Rework how socket readyness is detected
net/server_epoll.lua
--- a/net/server_epoll.lua	Fri Feb 02 19:48:04 2018 +0000
+++ b/net/server_epoll.lua	Fri Feb 02 23:46:00 2018 +0100
@@ -505,9 +505,10 @@
 	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 @@
 
 -- Connected!
 function interface:onconnect()
+	self:setflags(true, false);
+	self:on("connect");
+end
+
+function interface:onfirstwritable()
+	self.onreadable = nil;
 	self.onwriteable = nil;
-	self:setflags(true, false);
-	if not self._connected then
-		self._connected = true;
-		self:on("connect");
-	end
+	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