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;
-		}
-	}
-
 }