Mercurial Hosting > luan
diff src/luan/modules/http/LuanHandler.java @ 1263:382c444a6c77
add Http.eval_in_root and Http.handle_error
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 24 Sep 2018 22:06:25 -0600 |
parents | e38f5869e9df |
children | d41997776788 |
line wrap: on
line diff
--- a/src/luan/modules/http/LuanHandler.java Mon Sep 24 14:48:59 2018 -0600 +++ b/src/luan/modules/http/LuanHandler.java Mon Sep 24 22:06:25 2018 -0600 @@ -6,8 +6,6 @@ import java.io.IOException; import java.lang.reflect.Method; import java.net.BindException; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import luan.webserver.Request; @@ -23,25 +21,26 @@ import luan.LuanCloner; import luan.LuanException; import luan.modules.PackageLuan; +import luan.modules.BasicLuan; -public class LuanHandler implements Handler, Closeable { +public final class LuanHandler implements Handler, Closeable { private final LuanState luanInit; private final Logger logger; - private final HttpServicer httpServicer; - private final ReadWriteLock lock = new ReentrantReadWriteLock(); - private LuanState luan; + private volatile LuanState luan; private static final Method resetLuanMethod; + private static final Method evalInRootMethod; static { try { - resetLuanMethod = LuanHandler.class.getMethod("reset_luan"); + resetLuanMethod = LuanHandler.class.getMethod( "reset_luan" ); + evalInRootMethod = LuanHandler.class.getMethod( "eval_in_root", String.class ); } catch(NoSuchMethodException e) { throw new RuntimeException(e); } } - public LuanHandler(LuanState luanInit,String loggerRoot,HttpServicer httpServicer) { + public LuanHandler(LuanState luanInit,String loggerRoot) { this.luanInit = luanInit; if( loggerRoot==null ) loggerRoot = ""; @@ -49,10 +48,10 @@ try { LuanTable Http = (LuanTable)PackageLuan.require(luanInit,"luan:http/Http.luan"); Http.rawPut( "reset_luan", new LuanJavaFunction(resetLuanMethod,this) ); + Http.rawPut( "eval_in_root", new LuanJavaFunction(evalInRootMethod,this) ); } catch(LuanException e) { throw new RuntimeException(e); } - this.httpServicer = httpServicer!=null ? httpServicer : new HttpServicer(); setLuan(); luanInit.onClose(this); } @@ -83,11 +82,9 @@ Thread thread = Thread.currentThread(); String oldName = thread.getName(); thread.setName(request.headers.get("host")+request.path); - lock.readLock().lock(); try { - return httpServicer.service(luan,request,modName); + return HttpServicer.service(luan,request,modName); } finally { - lock.readLock().unlock(); thread.setName(oldName); } } @@ -99,41 +96,24 @@ } public Object call_rpc(String fnName,Object... args) throws LuanException { - lock.readLock().lock(); - try { - LuanFunction fn; - LuanState luan = this.luan; - synchronized(luan) { - PackageLuan.enableLoad(luan,"luan:Rpc.luan"); - LuanTable rpc = (LuanTable)PackageLuan.require(luan,"luan:Rpc.luan"); - LuanTable fns = (LuanTable)rpc.get(luan,"functions"); - fn = (LuanFunction)fns.get(luan,fnName); - if( fn == null ) - throw new LuanException( "function not found: " + fnName ); - LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); - luan = (LuanState)cloner.clone(luan); - fn = (LuanFunction)cloner.get(fn); - } - return fn.call(luan,args); - } finally { - lock.readLock().unlock(); + LuanFunction fn; + LuanState luan = this.luan; + synchronized(luan) { + PackageLuan.enableLoad(luan,"luan:Rpc.luan"); + LuanTable rpc = (LuanTable)PackageLuan.require(luan,"luan:Rpc.luan"); + LuanTable fns = (LuanTable)rpc.get(luan,"functions"); + fn = (LuanFunction)fns.get(luan,fnName); + if( fn == null ) + throw new LuanException( "function not found: " + fnName ); + LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); + luan = (LuanState)cloner.clone(luan); + fn = (LuanFunction)cloner.get(fn); } + return fn.call(luan,args); } public void reset_luan() { - new Thread() { - public void run() { - lock.writeLock().lock(); - try { - synchronized(luan) { - luan.close(); - setLuan(); - } - } finally { - lock.writeLock().unlock(); - } - } - }.start(); + setLuan(); } public Object runLuan(String sourceText,String sourceName) throws LuanException { @@ -145,6 +125,16 @@ } } + public void eval_in_root(String text) throws LuanException { + LuanState luan; + synchronized(this.luan) { + LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); + luan = (LuanState)cloner.clone(this.luan); + } + BasicLuan.load(text,"<eval_in_root>",null).call(luan); + this.luan = luan; + } + public static void start(Server server) throws Exception { try { server.start();