Mercurial Hosting > luan
diff src/luan/modules/http/LuanHandler.java @ 786:fe63c508a177
add Http.reset_luan()
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 02 Sep 2016 17:43:29 -0600 |
parents | d69d3c51c44e |
children | ca81307adf7c |
line wrap: on
line diff
--- a/src/luan/modules/http/LuanHandler.java Thu Sep 01 21:32:28 2016 -0600 +++ b/src/luan/modules/http/LuanHandler.java Fri Sep 02 17:43:29 2016 -0600 @@ -1,6 +1,9 @@ package luan.modules.http; import java.io.IOException; +import java.lang.reflect.Method; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -9,24 +12,43 @@ import org.slf4j.LoggerFactory; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; +import luan.Luan; import luan.LuanState; import luan.LuanTable; import luan.LuanFunction; +import luan.LuanJavaFunction; import luan.LuanCloner; import luan.LuanException; import luan.modules.PackageLuan; public class LuanHandler extends AbstractHandler { - private final LuanState luan; + private final LuanState luanInit; private final Logger logger; private String welcomeFile = "index.html"; + private final ReadWriteLock lock = new ReentrantReadWriteLock(); + private LuanState luan; + + private static final Method resetLuanMethod; + static { + try { + resetLuanMethod = LuanHandler.class.getMethod("reset_luan"); + } catch(NoSuchMethodException e) { + throw new RuntimeException(e); + } + } public LuanHandler(LuanState luan,String loggerRoot) { - this.luan = luan; + this.luanInit = luan; if( loggerRoot==null ) loggerRoot = ""; logger = LoggerFactory.getLogger(loggerRoot+LuanHandler.class.getName()); + try { + LuanTable Http = (LuanTable)PackageLuan.require(luanInit,"luan:http/Http.luan"); + Http.rawPut( "reset_luan", new LuanJavaFunction(resetLuanMethod,this) ); + } catch(LuanException e) { + throw new RuntimeException(e); + } } @Override public void handle(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response) @@ -34,6 +56,7 @@ { if( target.endsWith("/") ) target += welcomeFile; + lock.readLock().lock(); try { if( !HttpServicer.service(luan,request,response,"site:"+target+".luan") ) return; @@ -42,6 +65,8 @@ String err = e.getFullMessage(); logger.error(err); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,err); + } finally { + lock.readLock().unlock(); } baseRequest.setHandled(true); } @@ -50,6 +75,13 @@ this.welcomeFile = welcomeFile; } + @Override protected void doStart() throws Exception { +// Thread.dumpStack(); +//System.out.println("qqqqqqqqqqqqqqqqqqqq doStart "+this); + setLuan(); + super.doStart(); + } + @Override protected void doStop() throws Exception { synchronized(luan) { luan.close(); @@ -65,10 +97,7 @@ */ public Object call_rpc(String fnName,Object... args) throws LuanException { - return callRpc(luan,fnName,args); - } - - public static Object callRpc(LuanState luan,String fnName,Object... args) throws LuanException { + LuanState luan = this.luan; synchronized(luan) { LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); luan = (LuanState)cloner.clone(luan); @@ -81,4 +110,40 @@ return fn.call(luan,args); } + public void reset_luan() { + new Thread() { + public void run() { + lock.writeLock().lock(); + try { + synchronized(luan) { + luan.close(); + setLuan(); + } + } catch(IOException e) { + logger.error("reset_luan failed",e); + } finally { + lock.writeLock().unlock(); + } + } + }.start(); + } + + private void setLuan() { + LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); + luan = (LuanState)cloner.clone(luanInit); + try { + PackageLuan.load(luan,"site:/init.luan"); + } catch(LuanException e) { + String err = e.getFullMessage(); + logger.error(err); + } + } + + public Object runLuan(String sourceText,String sourceName) throws LuanException { + LuanFunction fn = Luan.load(sourceText,sourceName); + synchronized(luan) { + return fn.call(luan); + } + } + }