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_event.lua | 21 +++++++++++++++++++++ net/server_select.lua | 23 +++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/net/server_event.lua b/net/server_event.lua index 8eaa96da..43e70a0f 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -845,11 +845,32 @@ function hook_signal(signal_num, handler) return signal_events[signal_num]; end +local function link(sender, receiver, buffersize) + sender:set_mode(buffersize); + local sender_locked; + + function receiver:ondrain() + if sender_locked then + sender:resume(); + sender_locked = nil; + end + end + + function sender:onincoming(data) + receiver:write(data); + if receiver.writebufferlen >= buffersize then + sender_locked = true; + sender:pause(); + end + end +end + return { cfg = cfg, base = base, loop = loop, + link = link, event = event, event_base = base, addevent = newevent, 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