changeset 1852:be88e04bcae0 default tip

add luan.rootRegistry
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 23 Feb 2025 11:10:31 -0700
parents 9d093f14e240
children
files src/luan/Luan.java src/luan/modules/PackageLuan.java src/luan/modules/ThreadLuan.java src/luan/modules/http/LuanHandler.java src/luan/modules/logging/LuanLogger.java
diffstat 5 files changed, 26 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/Luan.java	Sat Feb 22 23:38:40 2025 -0700
+++ b/src/luan/Luan.java	Sun Feb 23 11:10:31 2025 -0700
@@ -29,18 +29,21 @@
 	private static final FileClassLoader emptyClassLoader = FileClassLoader.getFileClassLoader( Collections.emptyList() );
 
 	private final List<LuanClosure> stack = new ArrayList<LuanClosure>();
-	private final Map registry;
+	public final Map registry;
+	public final Map rootRegistry;
 	private final Map localOnly = new HashMap();
 	private FileClassLoader classLoader;
 
 	public Luan() {
 		this.registry = new HashMap();
+		this.rootRegistry = new HashMap();
 		this.classLoader = emptyClassLoader;
 	}
 
 	public Luan(Luan luan) {
 		LuanMutable.makeImmutable(luan.registry);
 		this.registry = clone(luan.registry);
+		this.rootRegistry = luan.rootRegistry;
 		this.classLoader = luan.classLoader;
 	}
 
@@ -165,10 +168,6 @@
 		stack.remove(stack.size()-1);
 	}
 
-	public Map registry() {
-		return registry;
-	}
-
 	public Object eval(String cmd,Object... args) throws LuanException {
 		return load(cmd,"eval",false).call(this,args);
 	}
@@ -473,13 +472,13 @@
 	}
 
 	private static void check(Luan luan,int i,String op,Object... args) throws LuanException {
-		Security s = (Security)luan.registry().get(SECURITY_KEY);
+		Security s = (Security)luan.registry.get(SECURITY_KEY);
 		if( s!=null )
 			s.check(luan,luan.peek(i),op,args);
 	}
 
 	public static Security setSecurity(Luan luan,Security s) {
-		return (Security)luan.registry().put(SECURITY_KEY,s);
+		return (Security)luan.registry.put(SECURITY_KEY,s);
 	}
 
 
--- a/src/luan/modules/PackageLuan.java	Sat Feb 22 23:38:40 2025 -0700
+++ b/src/luan/modules/PackageLuan.java	Sun Feb 23 11:10:31 2025 -0700
@@ -19,23 +19,23 @@
 public final class PackageLuan {
 
 	public static LuanFunction requireFn(Luan luan) {
-		LuanFunction fn = (LuanFunction)luan.registry().get("Package.require");
+		LuanFunction fn = (LuanFunction)luan.registry.get("Package.require");
 		if( fn == null ) {
 			try {
 				fn = new LuanJavaFunction(PackageLuan.class.getMethod("require",Luan.class,String.class,LuanTable.class),null);
 			} catch(NoSuchMethodException e) {
 				throw new RuntimeException(e);
 			}
-			luan.registry().put("Package.require",fn);
+			luan.registry.put("Package.require",fn);
 		}
 		return fn;
 	}
 
 	public static Map loaded(Luan luan) {
-		Map map = (Map)luan.registry().get("Package.loaded");
+		Map map = (Map)luan.registry.get("Package.loaded");
 		if( map == null ) {
 			map = new HashMap();
-			luan.registry().put("Package.loaded",map);
+			luan.registry.put("Package.loaded",map);
 		}
 		return map;
 	}
--- a/src/luan/modules/ThreadLuan.java	Sat Feb 22 23:38:40 2025 -0700
+++ b/src/luan/modules/ThreadLuan.java	Sun Feb 23 11:10:31 2025 -0700
@@ -107,7 +107,7 @@
 			scheduler.schedule(r,0L,TimeUnit.MILLISECONDS);
 			return;
 		}
-		Closeables cs = (Closeables)luan.registry().get(CLOSEABLES);
+		Closeables cs = (Closeables)luan.registry.get(CLOSEABLES);
 		if( cs != null ) {
 			Closeable cl = new Closeable() {
 				public void close() {
@@ -151,9 +151,7 @@
 		}
 	}
 
-	private static Map<String,Callable> callableMap = new HashMap<String,Callable>();
-
-	private static void sweep() {
+	private static void sweep(Map<String,Callable> callableMap) {
 		long now = System.currentTimeMillis();
 		for( Iterator<Callable> iter = callableMap.values().iterator(); iter.hasNext(); ) {
 			Callable callable = iter.next();
@@ -163,27 +161,25 @@
 	}
 
 	public static synchronized Callable globalCallable(Luan luan,final String name,LuanFunction initFn,long timeout) throws LuanException {
+		Map<String,Callable> callableMap = (Map<String,Callable>)luan.rootRegistry.get("Luan.callableMap");
+		if( callableMap == null ) {
+			callableMap = new HashMap<String,Callable>();
+			luan.rootRegistry.put("Luan.callableMap",callableMap);
+		}
 		Callable callable = callableMap.get(name);
 		if( callable == null ) {
-			sweep();
+			sweep(callableMap);
 			callable = new Callable(initFn);
 			callableMap.put(name,callable);
-			Closeables cs = (Closeables)luan.registry().get(CLOSEABLES);
-			if( cs != null ) {
-				Closeable cl = new Closeable() {
-					public void close() {
-						removeGlobalCallable(name);
-					}
-				};
-				cs.addCloseable(cl);
-			}
 		}
 		callable.expires = System.currentTimeMillis() + timeout;
 		return callable;
 	}
 
-	public static synchronized void removeGlobalCallable(String name) {
-		callableMap.remove(name);
+	public static synchronized void removeGlobalCallable(Luan luan,String name) {
+		Map<String,Callable> callableMap = (Map<String,Callable>)luan.rootRegistry.get("Luan.callableMap");
+		if( callableMap != null )
+			callableMap.remove(name);
 	}
 
 
--- a/src/luan/modules/http/LuanHandler.java	Sat Feb 22 23:38:40 2025 -0700
+++ b/src/luan/modules/http/LuanHandler.java	Sun Feb 23 11:10:31 2025 -0700
@@ -74,9 +74,9 @@
 		} catch(LuanException e) {
 			throw new RuntimeException(e);
 		}
-		if( luanInit.registry().get(ThreadLuan.CLOSEABLES) != null )
+		if( luanInit.registry.get(ThreadLuan.CLOSEABLES) != null )
 			throw new RuntimeException(ThreadLuan.CLOSEABLES+" already set");
-		luanInit.registry().put(ThreadLuan.CLOSEABLES,fns);
+		luanInit.registry.put(ThreadLuan.CLOSEABLES,fns);
 		if( domain != null )
 			logger.warn("new "+domain);
 		newLuan();
--- a/src/luan/modules/logging/LuanLogger.java	Sat Feb 22 23:38:40 2025 -0700
+++ b/src/luan/modules/logging/LuanLogger.java	Sun Feb 23 11:10:31 2025 -0700
@@ -55,7 +55,7 @@
 		ThreadLocalAppender tla = (ThreadLocalAppender)globalAppender;
 		Appender appender;
 		synchronized(luan) {
-			appender = (Appender)luan.registry().get(KEY);
+			appender = (Appender)luan.registry.get(KEY);
 		}
 		if( appender == null )
 			appender = tla.defaultAppender;
@@ -79,7 +79,7 @@
 		if( globalAppender instanceof ThreadLocalAppender ) {
 			ThreadLocalAppender tla = (ThreadLocalAppender)globalAppender;
 			if( tla.threadLocal.get() != null ) {
-				luan.registry().put(KEY,appender);
+				luan.registry.put(KEY,appender);
 				tla.threadLocal.set(appender);
 			} else {
 				tla.defaultAppender = appender;