net.server_select, net.server_event: Add server.link() to link 2 connections with...
authorMatthew Wild <mwild1@gmail.com>
Wed, 5 May 2010 14:25:48 +0000 (15:25 +0100)
committerMatthew Wild <mwild1@gmail.com>
Wed, 5 May 2010 14:25:48 +0000 (15:25 +0100)
net/server_event.lua
net/server_select.lua

index 8eaa96da149037f6603713d363bc55fa8fdcfb56..43e70a0f7f135a0e1e7d4eb9915ad5ca7f18df2b 100644 (file)
@@ -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,
index 9bc112bbc08724b416821ff801741b37c4a8a7bf..68ac70919e8aaf12bf6cb38a25b02a96aed2cf05 100644 (file)
@@ -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,