net.server_{select,event}: Add 'ondetach' callback for listener objects, to notify...
authorMatthew Wild <mwild1@gmail.com>
Fri, 29 Aug 2014 10:39:56 +0000 (11:39 +0100)
committerMatthew Wild <mwild1@gmail.com>
Fri, 29 Aug 2014 10:39:56 +0000 (11:39 +0100)
net/server_event.lua
net/server_select.lua

index b05d16881d8501b77ec01577af00a14a653b8535..45938a13b46c94f718c3fcf8c6259dd3d1e31220 100644 (file)
@@ -438,8 +438,11 @@ do
        end
        
        function interface_mt:setlistener(listener)
-               self.onconnect, self.ondisconnect, self.onincoming, self.ontimeout, self.onstatus
-                       = listener.onconnect, listener.ondisconnect, listener.onincoming, listener.ontimeout, listener.onstatus;
+               self:ondetach(); -- Notify listener that it is no longer responsible for this connection
+               self.onconnect, self.ondisconnect, self.onincoming,
+               self.ontimeout, self.onstatus, self.ondetach
+                       = listener.onconnect, listener.ondisconnect, listener.onincoming,
+                       listener.ontimeout, listener.onstatus, listener.ondetach;
        end
        
        -- Stub handlers
@@ -453,6 +456,8 @@ do
        end
        function interface_mt:ondrain()
        end
+       function interface_mt:ondetach()
+       end
        function interface_mt:onstatus()
        end
 end
@@ -479,6 +484,7 @@ do
                        onincoming = listener.onincoming;  -- will be called when client sends data
                        ontimeout = listener.ontimeout; -- called when fatal socket timeout occurs
                        ondrain = listener.ondrain; -- called when writebuffer is empty
+                       ondetach = listener.ondetach; -- called when disassociating this listener from this connection
                        onstatus = listener.onstatus; -- called for status changes (e.g. of SSL/TLS)
                        eventread = false, eventwrite = false, eventclose = false,
                        eventhandshake = false, eventstarthandshake = false;  -- event handler
index e896451830d3c85c06d8721d8954528bf20f8112..2b23b4f04764e3e3ff32441291878d09f6b9f634 100644 (file)
@@ -284,6 +284,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
        local status = listeners.onstatus
        local disconnect = listeners.ondisconnect
        local drain = listeners.ondrain
+       local detach = listener.ondetach
 
        local bufferqueue = { } -- buffer array
        local bufferqueuelen = 0        -- end of buffer array
@@ -313,10 +314,14 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                return disconnect
        end
        handler.setlistener = function( self, listeners )
+               if detach then
+                       detach(self) -- Notify listener that it is no longer responsible for this connection
+               end
                dispatch = listeners.onincoming
                disconnect = listeners.ondisconnect
                status = listeners.onstatus
                drain = listeners.ondrain
+               detach = listeners.ondetach
        end
        handler.getstats = function( )
                return readtraffic, sendtraffic