diff src/luan/modules/ThreadLuan.java @ 775:1a68fc55a80c

simplify dir structure
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 26 Aug 2016 14:36:40 -0600
parents core/src/luan/modules/ThreadLuan.java@a82d385ec2c3
children fbbdd369a13a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/ThreadLuan.java	Fri Aug 26 14:36:40 2016 -0600
@@ -0,0 +1,71 @@
+package luan.modules;
+
+import java.io.Closeable;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import luan.Luan;
+import luan.LuanState;
+import luan.LuanFunction;
+import luan.LuanTable;
+import luan.LuanException;
+import luan.DeepCloner;
+
+
+public final class ThreadLuan {
+	private static final Executor exec = Executors.newCachedThreadPool();
+	private static final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
+
+	public static void fork(LuanState luan,LuanFunction fn,Object... args) {
+		DeepCloner cloner = new DeepCloner();
+		final LuanState newLuan = (LuanState)cloner.deepClone(luan);
+		final LuanFunction newFn = (LuanFunction)cloner.get(fn);
+		final Object[] newArgs = cloner.deepClone(args);
+		exec.execute(new Runnable(){public void run() {
+			try {
+				newFn.call(newLuan,newArgs);
+			} catch(LuanException e) {
+				e.printStackTrace();
+			}
+		}});
+	}
+
+	public static LuanFunction synchronized_(final LuanState luan,final LuanFunction fn) throws LuanException {
+		Utils.checkNotNull(fn);
+		return new LuanFunction() {
+			@Override public Object call(LuanState ingored,Object[] args) throws LuanException {
+				synchronized(luan) {
+					return fn.call(luan,args);
+				}
+			}
+		};
+	}
+
+	public static void schedule(LuanState luan,long delay,boolean repeat,LuanFunction fn,Object... args) {
+		DeepCloner cloner = new DeepCloner();
+		final LuanState newLuan = (LuanState)cloner.deepClone(luan);
+		final LuanFunction newFn = (LuanFunction)cloner.get(fn);
+		final Object[] newArgs = cloner.deepClone(args);
+		Runnable r = new Runnable(){public void run() {
+			try {
+				newFn.call(newLuan,newArgs);
+			} catch(LuanException e) {
+				e.printStackTrace();
+			}
+		}};
+		final ScheduledFuture sf;
+		if( repeat ) {
+			sf = scheduler.scheduleWithFixedDelay(r,delay,delay,TimeUnit.MILLISECONDS);
+		} else {
+			sf = scheduler.schedule(r,delay,TimeUnit.MILLISECONDS);
+		}
+		final Closeable c = new Closeable(){public void close(){
+			boolean b = sf.cancel(false);
+		}};
+		luan.registry().put(c,c);  // prevent gc
+		luan.onClose(c);
+	}
+
+}