annotate src/luan/modules/ThreadLuan.java @ 1308:70eecde81820

remove fn,... to improve readability
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 23 Jan 2019 23:37:02 -0700
parents 5345466fa61f
children d5739c101bd6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
167
4c0131c2b650 merge luan/lib into modules
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 142
diff changeset
1 package luan.modules;
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
2
715
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
3 import java.io.Closeable;
1166
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
4 import java.util.Arrays;
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
5 import java.util.Iterator;
794
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
6 import java.util.Map;
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
7 import java.util.HashMap;
794
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
8 import java.util.LinkedHashMap;
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
9 import java.util.concurrent.Executor;
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
10 import java.util.concurrent.Executors;
1106
151dc95f5e73 make thread scheduler public
Franklin Schmidt <fschmidt@gmail.com>
parents: 1104
diff changeset
11 import java.util.concurrent.ScheduledThreadPoolExecutor;
715
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
12 import java.util.concurrent.ScheduledFuture;
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
13 import java.util.concurrent.TimeUnit;
221
ec016471c6eb make LuanTable an interface
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
14 import luan.Luan;
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
15 import luan.LuanState;
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
16 import luan.LuanFunction;
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
17 import luan.LuanTable;
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
18 import luan.LuanException;
781
fbbdd369a13a rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
19 import luan.LuanCloner;
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
20
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
21
168
ebe9db183eb7 rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 167
diff changeset
22 public final class ThreadLuan {
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
23 private static final Executor exec = Executors.newCachedThreadPool();
1106
151dc95f5e73 make thread scheduler public
Franklin Schmidt <fschmidt@gmail.com>
parents: 1104
diff changeset
24 public static final ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(1);
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
25
1308
70eecde81820 remove fn,... to improve readability
Franklin Schmidt <fschmidt@gmail.com>
parents: 1302
diff changeset
26 public static void fork(LuanState luan,LuanFunction fn) {
785
d69d3c51c44e more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents: 782
diff changeset
27 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE);
782
655280eab1e2 start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents: 781
diff changeset
28 final LuanState newLuan = (LuanState)cloner.clone(luan);
433
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 301
diff changeset
29 final LuanFunction newFn = (LuanFunction)cloner.get(fn);
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
30 exec.execute(new Runnable(){public void run() {
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
31 try {
1308
70eecde81820 remove fn,... to improve readability
Franklin Schmidt <fschmidt@gmail.com>
parents: 1302
diff changeset
32 newFn.call(newLuan);
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
33 } catch(LuanException e) {
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
34 e.printStackTrace();
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
35 }
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
36 }});
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
37 }
788
c9409e28daa2 remove Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 785
diff changeset
38 /*
582
31926755689e add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
39 public static LuanFunction synchronized_(final LuanState luan,final LuanFunction fn) throws LuanException {
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 582
diff changeset
40 Utils.checkNotNull(fn);
582
31926755689e add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
41 return new LuanFunction() {
31926755689e add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
42 @Override public Object call(LuanState ingored,Object[] args) throws LuanException {
31926755689e add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
43 synchronized(luan) {
31926755689e add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
44 return fn.call(luan,args);
31926755689e add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
45 }
31926755689e add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
46 }
31926755689e add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
47 };
31926755689e add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
48 }
788
c9409e28daa2 remove Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 785
diff changeset
49 */
1301
a9cc35c71eb0 go back to Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
50 public static void schedule(LuanState luan,long delay,LuanFunction fn,String repeating)
a9cc35c71eb0 go back to Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
51 throws LuanException
a9cc35c71eb0 go back to Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
52 {
785
d69d3c51c44e more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents: 782
diff changeset
53 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE);
782
655280eab1e2 start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents: 781
diff changeset
54 final LuanState newLuan = (LuanState)cloner.clone(luan);
715
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
55 final LuanFunction newFn = (LuanFunction)cloner.get(fn);
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
56 Runnable r = new Runnable(){public void run() {
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
57 try {
1301
a9cc35c71eb0 go back to Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
58 newFn.call(newLuan);
715
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
59 } catch(LuanException e) {
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
60 e.printStackTrace();
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
61 }
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
62 }};
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
63 final ScheduledFuture sf;
1301
a9cc35c71eb0 go back to Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
64 if( repeating==null ) {
a9cc35c71eb0 go back to Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
65 sf = scheduler.schedule(r,delay,TimeUnit.MILLISECONDS);
a9cc35c71eb0 go back to Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
66 } else if( repeating.equals("with_fixed_delay") ) {
715
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
67 sf = scheduler.scheduleWithFixedDelay(r,delay,delay,TimeUnit.MILLISECONDS);
1301
a9cc35c71eb0 go back to Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
68 } else if( repeating.equals("at_fixed_rate") ) {
a9cc35c71eb0 go back to Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
69 sf = scheduler.scheduleAtFixedRate(r,delay,delay,TimeUnit.MILLISECONDS);
715
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
70 } else {
1302
5345466fa61f fix last commit and improve stringify
Franklin Schmidt <fschmidt@gmail.com>
parents: 1301
diff changeset
71 throw new LuanException("repeating must be nil or 'with_fixed_delay' or 'at_fixed_rate'");
715
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
72 }
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
73 final Closeable c = new Closeable(){public void close(){
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
74 boolean b = sf.cancel(false);
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
75 }};
1202
d3a3ca116e42 gc site instances
Franklin Schmidt <fschmidt@gmail.com>
parents: 1166
diff changeset
76 newLuan.registry().put(luan,luan); // prevent gc
715
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
77 luan.registry().put(c,c); // prevent gc
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
78 luan.onClose(c);
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
79 }
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
80
1159
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1157
diff changeset
81 /*
1099
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
82 public static class GlobalMap {
794
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
83
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
84 private static class Value {
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
85 final long time = System.currentTimeMillis();
1099
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
86 final Object v;
794
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
87
1099
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
88 Value(Object v) {
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
89 this.v = v;
794
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
90 }
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
91 }
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
92
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
93 public long timeout = 60000L; // one minute
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
94 private Map<String,Value> map = new LinkedHashMap<String,Value>() {
1080
0d884377e923 eliminate other head
Franklin Schmidt <fschmidt@gmail.com>
parents: 814
diff changeset
95 protected boolean removeEldestEntry(Map.Entry<String,Value> eldest) {
794
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
96 return eldest.getValue().time < System.currentTimeMillis() - timeout;
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
97 }
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
98 };
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
99
1099
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
100 public synchronized Object get(String key) {
794
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
101 Value val = map.get(key);
1099
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
102 return val==null ? null : val.v;
794
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
103 }
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
104
1099
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
105 public synchronized Object put(String key,Object v) throws LuanException {
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
106 Value val;
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
107 if( v == null ) {
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
108 val = map.remove(key);
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
109 } else {
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
110 if( !(v instanceof String || v instanceof Boolean || v instanceof Number) )
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
111 throw new LuanException("can't assign type "+Luan.type(v)+" to Thread.global");
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
112 val = map.put(key,new Value(v));
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
113 }
a5406f076726 improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1080
diff changeset
114 return val==null ? null : val.v;
794
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
115 }
f16c77ef0f4f add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 788
diff changeset
116 }
1159
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1157
diff changeset
117 */
1104
772d16c89056 add Thread.sleep()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1099
diff changeset
118
772d16c89056 add Thread.sleep()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1099
diff changeset
119 public static void sleep(long millis) throws InterruptedException {
772d16c89056 add Thread.sleep()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1099
diff changeset
120 Thread.sleep(millis);
772d16c89056 add Thread.sleep()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1099
diff changeset
121 }
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
122
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
123
1243
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
124 private static class Unsafe {
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
125 private final String reason;
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
126
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
127 Unsafe(String reason) {
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
128 this.reason = reason;
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
129 }
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
130 }
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
131
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1243
diff changeset
132 private static Object makeSafe(LuanState luan,Object v) {
1243
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
133 if( v instanceof LuanTable ) {
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
134 LuanTable tbl = (LuanTable)v;
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
135 if( tbl.getMetatable() != null )
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
136 return new Unsafe("table with metatable");
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1243
diff changeset
137 LuanTable rtn = new LuanTable(luan);
1243
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
138 for( Map.Entry entry : tbl.rawIterable() ) {
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1243
diff changeset
139 Object key = makeSafe( luan, entry.getKey() );
1243
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
140 if( key instanceof Unsafe )
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
141 return key;
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1243
diff changeset
142 Object value = makeSafe( luan, entry.getValue() );
1243
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
143 if( value instanceof Unsafe )
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
144 return value;
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
145 rtn.rawPut(key,value);
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
146 }
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
147 return rtn;
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
148 } else if( v instanceof Object[] ) {
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
149 Object[] a = (Object[])v;
1243
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
150 for( int i=0; i<a.length; i++ ) {
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1243
diff changeset
151 Object obj = makeSafe(luan,a[i]);
1243
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
152 if( obj instanceof Unsafe )
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
153 return obj;
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
154 a[i] = obj;
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
155 }
1243
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
156 return a;
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
157 } else {
1243
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
158 if( v==null || v instanceof String || v instanceof Boolean || v instanceof Number )
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
159 return v;
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
160 return new Unsafe("type "+Luan.type(v));
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
161 }
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
162 }
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
163
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
164 public static final class Callable {
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
165 private long expires;
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
166 private final LuanState luan = new LuanState();
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
167 private final LuanTable fns;
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
168
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
169 Callable(LuanState luan,LuanTable fns) {
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
170 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE);
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
171 this.fns = (LuanTable)cloner.get(fns);
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
172 }
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
173
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1243
diff changeset
174 public synchronized Object call(LuanState callerLuan,String fnName,Object... args) throws LuanException {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1243
diff changeset
175 Object obj = makeSafe(luan,args);
1243
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
176 if( obj instanceof Unsafe )
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
177 throw new LuanException("can't pass "+((Unsafe)obj).reason+" to global_callable "+Arrays.asList(args));
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
178 args = (Object[])obj;
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1243
diff changeset
179 Object f = fns.get(fnName);
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
180 if( f == null )
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
181 throw new LuanException("function '"+fnName+"' not found in global_callable");
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
182 if( !(f instanceof LuanFunction) )
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
183 throw new LuanException("value of '"+fnName+"' not a function in global_callable");
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
184 LuanFunction fn = (LuanFunction)f;
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
185 Object rtn = fn.call(luan,args);
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1243
diff changeset
186 rtn = makeSafe(callerLuan,rtn);
1243
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
187 if( rtn instanceof Unsafe )
3ffc7c4a3b85 improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
188 throw new LuanException("can't return "+((Unsafe)rtn).reason+" from global_callable");
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
189 return rtn;
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
190 }
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
191 }
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
192
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
193 private static Map<String,Callable> callableMap = new HashMap<String,Callable>();
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
194
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
195 private static void sweep() {
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
196 long now = System.currentTimeMillis();
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
197 for( Iterator<Callable> iter = callableMap.values().iterator(); iter.hasNext(); ) {
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
198 Callable callable = iter.next();
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
199 if( callable.expires < now )
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
200 iter.remove();
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
201 }
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
202 }
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
203
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
204 public static synchronized Callable globalCallable(LuanState luan,String name,long timeout,LuanTable fns) {
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
205 Callable callable = callableMap.get(name);
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
206 if( callable == null ) {
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
207 sweep();
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
208 callable = new Callable(luan,fns);
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
209 callableMap.put(name,callable);
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
210 }
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
211 callable.expires = System.currentTimeMillis() + timeout;
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
212 return callable;
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
213 }
1159
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1157
diff changeset
214
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1157
diff changeset
215 public static synchronized void removeGlobalCallable(String name) {
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1157
diff changeset
216 callableMap.remove(name);
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1157
diff changeset
217 }
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1157
diff changeset
218
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
219 }