annotate src/luan/modules/ThreadLuan.java @ 1443:42c07ecb0ddc

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