diff http/src/luan/modules/http/HttpServicer.java @ 626:53a50c70c5e2

add Luan.assert_function() and Http.run_later()
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 17 Jan 2016 06:19:46 -0700
parents 60c549d43988
children 859c0dedc8b6
line wrap: on
line diff
--- a/http/src/luan/modules/http/HttpServicer.java	Tue Jan 12 23:52:56 2016 -0700
+++ b/http/src/luan/modules/http/HttpServicer.java	Sun Jan 17 06:19:46 2016 -0700
@@ -11,6 +11,8 @@
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.Enumeration;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.ServletException;
 import javax.servlet.http.Cookie;
@@ -157,6 +159,7 @@
 		module.rawPut("response",responseTbl);
 
 		fn.call(luan);
+		handle_run_later(luan);
 		return true;
 	}
 
@@ -256,4 +259,34 @@
 		}
 	}
 
+
+
+	private static String RUN_LATER_KEY = "Http.run_later";
+	private static final Executor exec = Executors.newSingleThreadExecutor();
+
+	public static void run_later(final LuanState luan,final LuanFunction fn,final Object... args) {
+		List list = (List)luan.registry().get(RUN_LATER_KEY);
+		if( list == null ) {
+			list = new ArrayList();
+			luan.registry().put(RUN_LATER_KEY,list);
+		}
+		list.add(
+			new Runnable(){public void run() {
+				try {
+					fn.call(luan,args);
+				} catch(LuanException e) {
+					e.printStackTrace();
+				}
+			}}
+		);
+	}
+
+	private static void handle_run_later(LuanState luan) {
+		List list = (List)luan.registry().get(RUN_LATER_KEY);
+		if( list==null )
+			return;
+		for( Object obj : list ) {
+			exec.execute((Runnable)obj);
+		}
+	}
 }