changeset 762:3f461f85243d

better rpc thread handling
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 20 Jul 2016 23:55:59 -0600
parents 99356cfde2f0
children 98df1c19ed7d
files core/src/luan/modules/Rpc.luan http/src/luan/modules/http/LuanHandler.java http/src/luan/modules/http/Server.luan
diffstat 3 files changed, 35 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/core/src/luan/modules/Rpc.luan	Wed Jul 20 01:52:20 2016 -0600
+++ b/core/src/luan/modules/Rpc.luan	Wed Jul 20 23:55:59 2016 -0600
@@ -3,8 +3,11 @@
 local Luan = require "luan:Luan.luan"
 local error = Luan.error
 local set_metatable = Luan.set_metatable or error()
+local try = Luan.try or error()
 local Io = require "luan:Io.luan"
 local Thread = require "luan:Thread.luan"
+local Logging = require "luan:logging/Logging.luan"  -- external dependency
+local logger = Logging.logger "Rpc"
 
 
 local M = {}
@@ -37,22 +40,29 @@
 	return M.remote_socket(socket)
 end
 
-function M.responder(fns)
-	local server = Io.socket_server(M.port)
-	return function()
-		local socket = server()
-		M.respond(socket,fns)
+function M.serve(port,fns)
+	local server = Io.socket_server(port or M.port)
+	while true do
+		try {
+			function()
+				local socket = server()
+				local function respond()
+					try {
+						function()
+							M.respond(socket,fns)
+						end
+						catch = function(e)
+							logger.error(e)
+						end
+					}
+				end
+				Thread.fork(respond)
+			end
+			catch = function(e)
+				logger.error(e)
+			end
+		}
 	end
 end
 
---[[
-function M.serve(port,fns)
-	local server = Io.socket_server(port)
-	while true do
-		local socket = server()
-		Thread.fork(function() M.respond(socket,fns) end)
-	end
-end
-]]
-
 return M
--- a/http/src/luan/modules/http/LuanHandler.java	Wed Jul 20 01:52:20 2016 -0600
+++ b/http/src/luan/modules/http/LuanHandler.java	Wed Jul 20 23:55:59 2016 -0600
@@ -12,6 +12,7 @@
 import luan.LuanState;
 import luan.LuanTable;
 import luan.LuanFunction;
+import luan.DeepCloner;
 import luan.LuanException;
 import luan.modules.PackageLuan;
 
@@ -68,13 +69,15 @@
 
 	public static Object callRpc(LuanState luan,String fnName,Object... args) throws LuanException {
 		synchronized(luan) {
-			LuanTable rpc = (LuanTable)PackageLuan.require(luan,"luan:Rpc.luan");
-			LuanTable fns = (LuanTable)rpc.get(luan,"functions");
-			LuanFunction fn = (LuanFunction)fns.get(luan,fnName);
-			if( fn == null )
-				throw new LuanException( "function not found: " + fnName );
-			return fn.call(luan,args);
+			DeepCloner cloner = new DeepCloner();
+			luan = (LuanState)cloner.deepClone(luan);
 		}
+		LuanTable rpc = (LuanTable)PackageLuan.require(luan,"luan:Rpc.luan");
+		LuanTable fns = (LuanTable)rpc.get(luan,"functions");
+		LuanFunction fn = (LuanFunction)fns.get(luan,fnName);
+		if( fn == null )
+			throw new LuanException( "function not found: " + fnName );
+		return fn.call(luan,args);
 	}
 
 }
--- a/http/src/luan/modules/http/Server.luan	Wed Jul 20 01:52:20 2016 -0600
+++ b/http/src/luan/modules/http/Server.luan	Wed Jul 20 23:55:59 2016 -0600
@@ -1,6 +1,5 @@
 local Luan = require "luan:Luan.luan"
 local error = Luan.error
-local try = Luan.try or error()
 local String = require "luan:String.luan"
 local gsub = String.gsub or error()
 local matches = String.matches or error()
@@ -107,19 +106,7 @@
 		return M.luan_handler.call_rpc(fn_name,...)
 	end
 
-	local function run_server()
-		local responder = Rpc.responder()
-		while true do
-			try {
-				responder
-				catch = function(e)
-					logger.warn(e)
-				end
-			}
-		end
-	end
-	
-	Thread.fork(run_server)
+	Thread.fork(Rpc.serve)
 end
 
 function M.serve(dir)