From c51d0beea7af41fd615cb11640a2a6bb0fcf1aab Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Wed, 5 May 2010 15:21:17 +0100 Subject: net.server_select, net.server_event: Support for :pause() and :resume() on connections --- net/server_select.lua | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'net/server_select.lua') diff --git a/net/server_select.lua b/net/server_select.lua index 48262ccc..6d6f7fbc 100644 --- a/net/server_select.lua +++ b/net/server_select.lua @@ -392,6 +392,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport maxreadlen = readlen or maxreadlen return bufferlen, maxreadlen, maxsendlen end + --TODO: Deprecate handler.lock_read = function (self, switch) if switch == true then local tmp = _readlistlen @@ -409,6 +410,12 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport end return noread end + handler.pause = function (self) + return self:lock_read(true); + end + handler.resume = function (self) + return self:lock_read(false); + end handler.lock = function( self, switch ) handler.lock_read (switch) if switch == true then -- cgit v1.2.3 From 242d67b43e37e5fa4a831011f70a2429957f7b6b Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Wed, 5 May 2010 15:23:17 +0100 Subject: net.server_select, net.server_event: Rename :pattern() method to :set_mode() for select backend, and add :set_mode() to event backend --- net/server_select.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'net/server_select.lua') diff --git a/net/server_select.lua b/net/server_select.lua index 6d6f7fbc..475e8aca 100644 --- a/net/server_select.lua +++ b/net/server_select.lua @@ -379,7 +379,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport handler.socket = function( self ) return socket end - handler.pattern = function( self, new ) + handler.set_mode = function( self, new ) pattern = new or pattern return pattern end -- cgit v1.2.3 From 3c7eb58b08e7f416d73f86061706674d37f83c4f Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Wed, 5 May 2010 15:24:24 +0100 Subject: net.server_select, net.server_event: Support for ondrain listener callback for when send buffer is empty --- net/server_select.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'net/server_select.lua') diff --git a/net/server_select.lua b/net/server_select.lua index 475e8aca..9bc112bb 100644 --- a/net/server_select.lua +++ b/net/server_select.lua @@ -252,6 +252,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport local dispatch = listeners.onincoming local status = listeners.onstatus local disconnect = listeners.ondisconnect + local drain = listeners.ondrain local bufferqueue = { } -- buffer array local bufferqueuelen = 0 -- end of buffer array @@ -284,6 +285,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport dispatch = listeners.onincoming disconnect = listeners.ondisconnect status = listeners.onstatus + drain = listeners.ondrain end handler.getstats = function( ) return readtraffic, sendtraffic @@ -437,7 +439,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport end local _readbuffer = function( ) -- this function reads data local buffer, err, part = receive( socket, pattern ) -- receive buffer with "pattern" - if not err or (err == "wantread" or err == "timeout") or (part and string_len(part) > 0) then -- received something + if not err or (err == "wantread" or err == "timeout") then -- received something local buffer = buffer or part or "" local len = string_len( buffer ) if len > maxreadlen then @@ -479,6 +481,9 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) -- delete socket from writelist _ = needtls and handler:starttls(nil, true) _writetimes[ handler ] = nil + if drain then + drain(handler) + end _ = toclose and handler:close( ) return true elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write -- cgit v1.2.3 From a22e2228658189c68d1125f1fb6623088f8bc3cb Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Wed, 5 May 2010 15:25:48 +0100 Subject: net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size --- net/server_select.lua | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'net/server_select.lua') diff --git a/net/server_select.lua b/net/server_select.lua index 9bc112bb..68ac7091 100644 --- a/net/server_select.lua +++ b/net/server_select.lua @@ -675,6 +675,28 @@ closesocket = function( socket ) --mem_free( ) end +local function link(sender, receiver, buffersize) + sender:set_mode(buffersize); + local sender_locked; + local _sendbuffer = receiver.sendbuffer; + function receiver.sendbuffer() + _sendbuffer(); + if sender_locked and receiver.bufferlen() < buffersize then + sender:lock_read(false); -- Unlock now + sender_locked = nil; + end + end + + local _readbuffer = sender.readbuffer; + function sender.readbuffer() + _readbuffer(); + if not sender_locked and receiver.bufferlen() >= buffersize then + sender_locked = true; + sender:lock_read(true); + end + end +end + ----------------------------------// PUBLIC //-- addserver = function( addr, port, listeners, pattern, sslctx ) -- this function provides a way for other scripts to reg a server @@ -898,6 +920,7 @@ return { wrapclient = wrapclient, loop = loop, + link = link, stats = stats, closeall = closeall, addtimer = addtimer, -- cgit v1.2.3