Mercurial Hosting > luan
annotate src/luan/modules/ThreadLuan.java @ 1454:219f2b937f2b
remove log4j
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 08 Mar 2020 14:11:30 -0600 |
parents | 42c07ecb0ddc |
children | 78d937870762 |
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; |
1401 | 9 import java.lang.ref.Reference; |
10 import java.lang.ref.WeakReference; | |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
11 import java.util.concurrent.Executor; |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
12 import java.util.concurrent.Executors; |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
13 import java.util.concurrent.ScheduledExecutorService; |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
14 import java.util.concurrent.ScheduledFuture; |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
15 import java.util.concurrent.TimeUnit; |
1401 | 16 import java.util.concurrent.ConcurrentHashMap; |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
17 import java.util.concurrent.locks.Lock; |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
18 import java.util.concurrent.locks.ReadWriteLock; |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
19 import java.util.concurrent.locks.ReentrantLock; |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
20 import java.util.concurrent.locks.ReentrantReadWriteLock; |
221
ec016471c6eb
make LuanTable an interface
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
21 import luan.Luan; |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
22 import luan.LuanFunction; |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
23 import luan.LuanTable; |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
24 import luan.LuanException; |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
25 import luan.LuanCloner; |
1322 | 26 import luan.LuanCloneable; |
1454 | 27 import luan.modules.logging.LuanLogger; |
1402
27efb1fcbcb5
move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents:
1401
diff
changeset
|
28 import goodjava.logging.Logger; |
27efb1fcbcb5
move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents:
1401
diff
changeset
|
29 import goodjava.logging.LoggerFactory; |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
30 |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
31 |
168
ebe9db183eb7
rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
167
diff
changeset
|
32 public final class ThreadLuan { |
1401 | 33 private static final Logger logger = LoggerFactory.getLogger(ThreadLuan.class); |
34 | |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
35 private static final Executor exec = Executors.newCachedThreadPool(); |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
36 public static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
37 |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
38 private static Runnable runnable(final LuanFunction fn) { |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
39 return new Runnable() { |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
40 public synchronized void run() { |
1454 | 41 LuanLogger.startThreadLogging(fn.luan()); |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
42 try { |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
43 fn.call(); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
44 } catch(LuanException e) { |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
45 e.printStackTrace(); |
1454 | 46 } finally { |
47 LuanLogger.endThreadLogging(); | |
582
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
48 } |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
49 } |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
50 }; |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
51 } |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
52 |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
53 public static void fork(LuanFunction fn) { |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
54 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
55 final LuanFunction newFn = (LuanFunction)cloner.get(fn); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
56 exec.execute(runnable(newFn)); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
57 } |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
58 |
1401 | 59 private static Map<String,Reference<ScheduledFuture>> scheduleds = new ConcurrentHashMap<String,Reference<ScheduledFuture>>(); |
60 | |
1440 | 61 private static void cancel(ScheduledFuture sf,String src) { |
1439 | 62 boolean b = sf.cancel(false); |
1443 | 63 if( !sf.isCancelled() ) |
1441 | 64 logger.error(src+" cancel="+b+" isCancelled="+sf.isCancelled()+" isDone="+sf.isDone()+" "+sf); |
1439 | 65 } |
66 | |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
67 public static void schedule(LuanFunction fn,LuanTable options) |
1301
a9cc35c71eb0
go back to Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1267
diff
changeset
|
68 throws LuanException |
a9cc35c71eb0
go back to Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1267
diff
changeset
|
69 { |
1420 | 70 options = new LuanTable(options); |
71 Number delay = Utils.removeNumber(options,"delay"); | |
72 Number repeatingDelay = Utils.removeNumber(options,"repeating_delay"); | |
73 Number repeatingRate = Utils.removeNumber(options,"repeating_rate"); | |
74 String id = Utils.removeString(options,"id"); | |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
75 if( repeatingDelay!=null && repeatingRate!=null ) |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
76 throw new LuanException("can't define both repeating_delay and repeating_rate"); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
77 boolean repeating = repeatingDelay!=null || repeatingRate!=null; |
1420 | 78 Utils.checkEmpty(options); |
1401 | 79 if( id != null ) { |
80 Reference<ScheduledFuture> ref = scheduleds.remove(id); | |
81 if( ref != null ) { | |
82 ScheduledFuture sf = ref.get(); | |
83 if( sf != null ) | |
1441 | 84 cancel(sf,"id "+id); |
1401 | 85 } |
86 } | |
1335 | 87 Luan luan = fn.luan(); |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
782
diff
changeset
|
88 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
89 final Luan newLuan = (Luan)cloner.clone(luan); |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
90 final LuanFunction newFn = (LuanFunction)cloner.get(fn); |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
91 final Runnable r = runnable(newFn); |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
92 final ScheduledFuture sf; |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
93 if( repeatingDelay != null ) { |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
94 if( delay==null ) |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
95 delay = repeatingDelay; |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
96 sf = scheduler.scheduleWithFixedDelay(r,delay.longValue(),repeatingDelay.longValue(),TimeUnit.MILLISECONDS); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
97 } else if( repeatingRate != null ) { |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
98 if( delay==null ) |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
99 delay = repeatingRate; |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
100 sf = scheduler.scheduleWithFixedDelay(r,delay.longValue(),repeatingRate.longValue(),TimeUnit.MILLISECONDS); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
101 } else if( delay != null ) { |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
102 sf = scheduler.schedule(r,delay.longValue(),TimeUnit.MILLISECONDS); |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
103 } else { |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
104 scheduler.schedule(r,0L,TimeUnit.MILLISECONDS); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
105 return; |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
106 } |
1401 | 107 Object c = new Object() { |
108 protected void finalize() throws Throwable { | |
1440 | 109 cancel(sf,"gc"); |
1401 | 110 } |
111 }; | |
112 luan.registry().put(c,c); // cancel on gc | |
113 if( id != null ) | |
114 scheduleds.put(id,new WeakReference<ScheduledFuture>(sf)); | |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
115 } |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
116 |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
117 /* |
1099
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
118 public static class GlobalMap { |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
119 |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
120 private static class Value { |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
121 final long time = System.currentTimeMillis(); |
1099
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
122 final Object v; |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
123 |
1099
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
124 Value(Object v) { |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
125 this.v = v; |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
126 } |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
127 } |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
128 |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
129 public long timeout = 60000L; // one minute |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
130 private Map<String,Value> map = new LinkedHashMap<String,Value>() { |
1080 | 131 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
|
132 return eldest.getValue().time < System.currentTimeMillis() - timeout; |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
133 } |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
134 }; |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
135 |
1099
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
136 public synchronized Object get(String key) { |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
137 Value val = map.get(key); |
1099
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
138 return val==null ? null : val.v; |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
139 } |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
140 |
1099
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
141 public synchronized Object put(String key,Object v) throws LuanException { |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
142 Value val; |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
143 if( v == null ) { |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
144 val = map.remove(key); |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
145 } else { |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
146 if( !(v instanceof String || v instanceof Boolean || v instanceof Number) ) |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
147 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
|
148 val = map.put(key,new Value(v)); |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
149 } |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
150 return val==null ? null : val.v; |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
151 } |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
152 } |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
153 */ |
1104 | 154 |
155 public static void sleep(long millis) throws InterruptedException { | |
156 Thread.sleep(millis); | |
157 } | |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
158 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
159 |
1243
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
160 private static class Unsafe { |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
161 private final String reason; |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
162 |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
163 Unsafe(String reason) { |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
164 this.reason = reason; |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
165 } |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
166 } |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
167 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
168 private static Object makeSafe(Luan luan,Object v) throws LuanException { |
1243
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
169 if( v instanceof LuanTable ) { |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
170 LuanTable tbl = (LuanTable)v; |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
171 if( tbl.getMetatable() != null ) |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
172 return new Unsafe("table with metatable"); |
1267 | 173 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
|
174 for( Map.Entry entry : tbl.rawIterable() ) { |
1267 | 175 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
|
176 if( key instanceof Unsafe ) |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
177 return key; |
1267 | 178 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
|
179 if( value instanceof Unsafe ) |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
180 return value; |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
181 rtn.rawPut(key,value); |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
182 } |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
183 return rtn; |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
184 } else if( v instanceof Object[] ) { |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
185 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
|
186 for( int i=0; i<a.length; i++ ) { |
1267 | 187 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
|
188 if( obj instanceof Unsafe ) |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
189 return obj; |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
190 a[i] = obj; |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
191 } |
1243
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
192 return a; |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
193 } else { |
1322 | 194 if( v instanceof LuanCloneable ) |
195 return new Unsafe("type "+Luan.type(v)); | |
196 return v; | |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
197 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
198 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
199 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
200 public static final class Callable { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
201 private long expires; |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
202 private final Luan luan = new Luan(); |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
203 private final LuanTable fns; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
204 |
1335 | 205 Callable(LuanTable fns) { |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
206 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
|
207 this.fns = (LuanTable)cloner.get(fns); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
208 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
209 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
210 public synchronized Object call(Luan callerLuan,String fnName,Object... args) throws LuanException { |
1267 | 211 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
|
212 if( obj instanceof Unsafe ) |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
213 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
|
214 args = (Object[])obj; |
1267 | 215 Object f = fns.get(fnName); |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
216 if( f == null ) |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
217 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
|
218 if( !(f instanceof LuanFunction) ) |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
219 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
|
220 LuanFunction fn = (LuanFunction)f; |
1335 | 221 Object rtn = fn.call(args); |
1267 | 222 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
|
223 if( rtn instanceof Unsafe ) |
3ffc7c4a3b85
improve Thread.global_callable to allow passing of safe tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
1202
diff
changeset
|
224 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
|
225 return rtn; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
226 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
227 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
228 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
229 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
|
230 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
231 private static void sweep() { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
232 long now = System.currentTimeMillis(); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
233 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
|
234 Callable callable = iter.next(); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
235 if( callable.expires < now ) |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
236 iter.remove(); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
237 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
238 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
239 |
1335 | 240 public static synchronized Callable globalCallable(String name,LuanTable fns,long timeout) { |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
241 Callable callable = callableMap.get(name); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
242 if( callable == null ) { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
243 sweep(); |
1335 | 244 callable = new Callable(fns); |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
245 callableMap.put(name,callable); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
246 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
247 callable.expires = System.currentTimeMillis() + timeout; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
248 return callable; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
249 } |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
250 |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
251 public static synchronized void removeGlobalCallable(String name) { |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
252 callableMap.remove(name); |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
253 } |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
254 |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
255 |
1381
8d7a39ca2c0c
add Rpc in_backup_read_lock
Franklin Schmidt <fschmidt@gmail.com>
parents:
1372
diff
changeset
|
256 public static void lock(Lock lock) |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
257 throws LuanException, InterruptedException |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
258 { |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
259 if( !lock.tryLock(10,TimeUnit.MINUTES) ) |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
260 throw new LuanException("failed to acquire lock"); |
1381
8d7a39ca2c0c
add Rpc in_backup_read_lock
Franklin Schmidt <fschmidt@gmail.com>
parents:
1372
diff
changeset
|
261 } |
8d7a39ca2c0c
add Rpc in_backup_read_lock
Franklin Schmidt <fschmidt@gmail.com>
parents:
1372
diff
changeset
|
262 |
8d7a39ca2c0c
add Rpc in_backup_read_lock
Franklin Schmidt <fschmidt@gmail.com>
parents:
1372
diff
changeset
|
263 public static Object runInLock(Lock lock,LuanFunction fn,Object... args) |
8d7a39ca2c0c
add Rpc in_backup_read_lock
Franklin Schmidt <fschmidt@gmail.com>
parents:
1372
diff
changeset
|
264 throws LuanException, InterruptedException |
8d7a39ca2c0c
add Rpc in_backup_read_lock
Franklin Schmidt <fschmidt@gmail.com>
parents:
1372
diff
changeset
|
265 { |
8d7a39ca2c0c
add Rpc in_backup_read_lock
Franklin Schmidt <fschmidt@gmail.com>
parents:
1372
diff
changeset
|
266 lock(lock); |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
267 try { |
1372
431d5bec3ca4
add Thread.new_synchronizer
Franklin Schmidt <fschmidt@gmail.com>
parents:
1366
diff
changeset
|
268 return fn.call(args); |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
269 } finally { |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
270 lock.unlock(); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
271 } |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
272 } |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
273 |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
274 } |