Mercurial Hosting > luan
changeset 787:c49980cdece6
use incremental cloning to serve web pages
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 04 Sep 2016 00:18:00 -0600 |
parents | fe63c508a177 |
children | c9409e28daa2 |
files | src/luan/LuanState.java src/luan/impl/Closure.java src/luan/modules/IoLuan.java src/luan/modules/PackageLuan.java src/luan/modules/http/HttpServicer.java |
diffstat | 5 files changed, 47 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/luan/LuanState.java Fri Sep 02 17:43:29 2016 -0600 +++ b/src/luan/LuanState.java Sun Sep 04 00:18:00 2016 -0600 @@ -17,6 +17,7 @@ public LuanJava java; private Map registry; private final List<Reference<Closeable>> onClose = new ArrayList<Reference<Closeable>>(); + public boolean isLocked = false; public LuanState() { java = new LuanJava(); @@ -33,16 +34,11 @@ LuanState clone = (LuanState)dc; clone.registry = cloner.clone(registry); clone.java = (LuanJava)cloner.clone(java); -/* - if( !cloner.deep ) { - LuanCloner myCloner = new LuanCloner(false); - registry = myCloner.clone(registry); - java = (LuanJava)myCloner.clone(java); - } -*/ + if( cloner.type == LuanCloner.Type.INCREMENTAL ) + isLocked = true; } - public final Map registry() { + public Map registry() { return registry; }
--- a/src/luan/impl/Closure.java Fri Sep 02 17:43:29 2016 -0600 +++ b/src/luan/impl/Closure.java Sun Sep 04 00:18:00 2016 -0600 @@ -52,6 +52,8 @@ } @Override public final Object call(LuanState luan,Object[] args) throws LuanException { + if( luan.isLocked ) + throw new RuntimeException("luan is locked"); check(); LuanJava old = luan.java; luan.java = ljava;
--- a/src/luan/modules/IoLuan.java Fri Sep 02 17:43:29 2016 -0600 +++ b/src/luan/modules/IoLuan.java Sun Sep 04 00:18:00 2016 -0600 @@ -685,7 +685,13 @@ LuanFunction opener = (LuanFunction)schemes.get(luan,scheme); if( opener == null ) throw new LuanException( "invalid scheme '"+scheme+"' in '"+name+"'" ); - return (LuanTable)Luan.first(opener.call(luan,new Object[]{location,options})); + boolean isLocked = luan.isLocked; // hack needed for luan scheme functions + luan.isLocked = false; + try { + return (LuanTable)Luan.first(opener.call(luan,new Object[]{location,options})); + } finally { + luan.isLocked = isLocked; + } } public static final class LuanSocket extends LuanIO {
--- a/src/luan/modules/PackageLuan.java Fri Sep 02 17:43:29 2016 -0600 +++ b/src/luan/modules/PackageLuan.java Sun Sep 04 00:18:00 2016 -0600 @@ -68,12 +68,39 @@ LuanTable t = IoLuan.uri(luan,uri,null); if( t == null ) return null; +/* LuanFunction existsFn = (LuanFunction)t.get(luan,"exists"); boolean exists = (Boolean)Luan.first(existsFn.call(luan)); if( !exists ) return null; LuanFunction reader = (LuanFunction)t.get(luan,"read_text"); return (String)Luan.first(reader.call(luan)); +*/ + IoLuan.LuanIn in = (IoLuan.LuanIn)t.rawGet("java"); + try { + if( !in.exists() ) + return null; + return in.read_text(); + } catch(IOException e) { + throw new LuanException(e); + } + } + + public static boolean wouldLoad(LuanState luan,String modName) throws LuanException { + LuanTable loaded = loaded(luan); + if( loaded.rawGet(modName) != null ) + return false; + if( modName.startsWith("java:") ) + return true; + LuanTable t = IoLuan.uri(luan,modName,null); + if( t == null ) + return false; + IoLuan.LuanIn in = (IoLuan.LuanIn)t.rawGet("java"); + try { + return in.exists(); + } catch(IOException e) { + throw new LuanException(e); + } } }
--- a/src/luan/modules/http/HttpServicer.java Fri Sep 02 17:43:29 2016 -0600 +++ b/src/luan/modules/http/HttpServicer.java Sun Sep 04 00:18:00 2016 -0600 @@ -46,6 +46,12 @@ { LuanFunction fn; synchronized(luan) { + if( luan.isLocked ) { + if( PackageLuan.wouldLoad(luan,"luan:http/Http.luan") || PackageLuan.wouldLoad(luan,modName) ) { + luan.isLocked = false; + luan.deepenClone(luan,new LuanCloner(LuanCloner.Type.COMPLETE)); + } + } LuanTable module = (LuanTable)PackageLuan.require(luan,"luan:http/Http.luan"); LuanTable per_session_pages = (LuanTable)module.rawGet("per_session_pages"); Object mod = PackageLuan.load(luan,modName); @@ -65,7 +71,7 @@ } fn = (LuanFunction)PackageLuan.require(luan,modName); } else { - LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); + LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); luan = (LuanState)cloner.clone(luan); fn = (LuanFunction)cloner.get(mod); }