Mercurial Hosting > luan
diff src/luan/lib/webserver/handlers/DomainHandler.java @ 1401:ef1620aa99cb
fix gc issues
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 16 Sep 2019 22:51:41 -0400 |
parents | 221eedb0f54e |
children |
line wrap: on
line diff
--- a/src/luan/lib/webserver/handlers/DomainHandler.java Fri Sep 13 05:05:51 2019 -0600 +++ b/src/luan/lib/webserver/handlers/DomainHandler.java Mon Sep 16 22:51:41 2019 -0400 @@ -3,7 +3,7 @@ import java.io.Closeable; import java.io.IOException; import java.lang.ref.Reference; -import java.lang.ref.WeakReference; +//import java.lang.ref.WeakReference; import java.lang.ref.SoftReference; import java.lang.ref.ReferenceQueue; import java.util.Map; @@ -22,25 +22,6 @@ public Handler newHandler(String domain); } - private static class Ref { - private final Handler handler; - - private Ref(Handler handler) { - this.handler = handler; - } - } - - private final ReferenceQueue<Ref> queue = new ReferenceQueue<Ref>(); - - private class MyReference extends WeakReference<Ref> { - private Handler handler; - - private MyReference(Ref r) { - super(r,queue); - this.handler = r.handler; - } - } - private static void close(Handler handler) { if( handler instanceof Closeable ) { try { @@ -51,18 +32,7 @@ } } - private void sweep() { - while(true) { - MyReference ref = (MyReference)queue.poll(); - if( ref == null ) - return; - //logger.info("sweep"); - close(ref.handler); - ref.handler = null; - } - } - - private final Map<String,MyReference> map = new HashMap<String,MyReference>(); + private final Map<String,Reference<Handler>> map = new HashMap<String,Reference<Handler>>(); private final Factory factory; @@ -81,37 +51,31 @@ } public Handler getHandler(String domain) { - Ref r = getRef(domain); - return r==null ? null : r.handler; + domain = domain.toLowerCase(); + synchronized(map) { + Reference<Handler> ref = map.get(domain); + Handler handler = ref==null ? null : ref.get(); + if( handler == null ) { + //if(ref!=null) logger.info("gc "+domain); + handler = factory.newHandler(domain); + if( handler == null ) + return null; + map.put(domain,new SoftReference<Handler>(handler)); + } + return handler; + } } public void removeHandler(String domain) { + logger.info("removeHandler "+domain); domain = domain.toLowerCase(); synchronized(map) { - Reference<Ref> ref = map.remove(domain); - Ref r = ref==null ? null : ref.get(); - if( r != null ) { - close(r.handler); + Reference<Handler> ref = map.remove(domain); + Handler handler = ref==null ? null : ref.get(); + if( handler != null ) { + close(handler); } } } - private Ref getRef(String domain) { - domain = domain.toLowerCase(); - synchronized(map) { - Reference<Ref> ref = map.get(domain); - Ref r = ref==null ? null : ref.get(); - if( r == null ) { - //if(ref!=null) logger.info("gc "+domain); - sweep(); - Handler handler = factory.newHandler(domain); - if( handler == null ) - return null; - r = new Ref(handler); - map.put(domain,new MyReference(r)); - } - return r; - } - } - }