Diff

net/server_select.lua @ 3003:48871a549b4c

net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
author Matthew Wild <mwild1@gmail.com>
date Wed, 05 May 2010 15:25:48 +0100
parent 3002:d1f864ed44c0
child 3007:9d122a6ae674
child 3008:23915803adbf
line wrap: on
line diff
--- a/net/server_select.lua	Wed May 05 15:24:24 2010 +0100
+++ b/net/server_select.lua	Wed May 05 15:25:48 2010 +0100
@@ -675,6 +675,28 @@
 	--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 @@
 	wrapclient = wrapclient,
 	
 	loop = loop,
+	link = link,
 	stats = stats,
 	closeall = closeall,
 	addtimer = addtimer,