Mercurial Hosting > luan
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); + } }