changeset 1853:b16d0991ae51 default tip

minor
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 23 Feb 2025 12:43:11 -0700
parents be88e04bcae0
children
files src/luan/Luan.java src/luan/modules/ThreadLuan.java
diffstat 2 files changed, 26 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/Luan.java	Sun Feb 23 11:10:31 2025 -0700
+++ b/src/luan/Luan.java	Sun Feb 23 12:43:11 2025 -0700
@@ -30,7 +30,7 @@
 
 	private final List<LuanClosure> stack = new ArrayList<LuanClosure>();
 	public final Map registry;
-	public final Map rootRegistry;
+	public final Map rootRegistry;  // synchronize access
 	private final Map localOnly = new HashMap();
 	private FileClassLoader classLoader;
 
--- a/src/luan/modules/ThreadLuan.java	Sun Feb 23 11:10:31 2025 -0700
+++ b/src/luan/modules/ThreadLuan.java	Sun Feb 23 12:43:11 2025 -0700
@@ -151,8 +151,7 @@
 		}
 	}
 
-	private static void sweep(Map<String,Callable> callableMap) {
-		long now = System.currentTimeMillis();
+	private static void sweep(Map<String,Callable> callableMap,long now) {
 		for( Iterator<Callable> iter = callableMap.values().iterator(); iter.hasNext(); ) {
 			Callable callable = iter.next();
 			if( callable.expires < now )
@@ -160,26 +159,33 @@
 		}
 	}
 
-	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);
+	public static Callable globalCallable(Luan luan,final String name,LuanFunction initFn,long timeout) throws LuanException {
+		Map rootRegistry = luan.rootRegistry;
+		synchronized(rootRegistry) {
+			Map<String,Callable> callableMap = (Map<String,Callable>)rootRegistry.get("Luan.callableMap");
+			if( callableMap == null ) {
+				callableMap = new HashMap<String,Callable>();
+				rootRegistry.put("Luan.callableMap",callableMap);
+			}
+			long now = System.currentTimeMillis();
+			Callable callable = callableMap.get(name);
+			if( callable == null ) {
+				sweep(callableMap,now);
+				callable = new Callable(initFn);
+				callableMap.put(name,callable);
+			}
+			callable.expires = now + timeout;
+			return callable;
 		}
-		Callable callable = callableMap.get(name);
-		if( callable == null ) {
-			sweep(callableMap);
-			callable = new Callable(initFn);
-			callableMap.put(name,callable);
-		}
-		callable.expires = System.currentTimeMillis() + timeout;
-		return callable;
 	}
 
-	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);
+	public static void removeGlobalCallable(Luan luan,String name) {
+		Map rootRegistry = luan.rootRegistry;
+		synchronized(rootRegistry) {
+			Map<String,Callable> callableMap = (Map<String,Callable>)rootRegistry.get("Luan.callableMap");
+			if( callableMap != null )
+				callableMap.remove(name);
+		}
 	}