annotate src/luan/modules/ThreadLuan.java @ 1599:f2a663a4ba9e

web logging
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 05 Apr 2021 00:13:05 -0600
parents c922446f53aa
children 7c7f28c724e8
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;
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
8 import java.util.concurrent.Executor;
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
9 import java.util.concurrent.Executors;
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
10 import java.util.concurrent.ScheduledExecutorService;
715
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
11 import java.util.concurrent.ScheduledFuture;
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
12 import java.util.concurrent.TimeUnit;
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
13 import java.util.concurrent.locks.Lock;
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
14 import java.util.concurrent.locks.ReentrantLock;
1515
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
15 import goodjava.util.WeakCacheMap;
221
ec016471c6eb make LuanTable an interface
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
16 import luan.Luan;
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
17 import luan.LuanFunction;
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
18 import luan.LuanTable;
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
19 import luan.LuanException;
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
20 import luan.LuanMutable;
1454
219f2b937f2b remove log4j
Franklin Schmidt <fschmidt@gmail.com>
parents: 1443
diff changeset
21 import luan.modules.logging.LuanLogger;
1402
27efb1fcbcb5 move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents: 1401
diff changeset
22 import goodjava.logging.Logger;
27efb1fcbcb5 move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents: 1401
diff changeset
23 import goodjava.logging.LoggerFactory;
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
24
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
25
168
ebe9db183eb7 rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 167
diff changeset
26 public final class ThreadLuan {
1401
ef1620aa99cb fix gc issues
Franklin Schmidt <fschmidt@gmail.com>
parents: 1389
diff changeset
27 private static final Logger logger = LoggerFactory.getLogger(ThreadLuan.class);
ef1620aa99cb fix gc issues
Franklin Schmidt <fschmidt@gmail.com>
parents: 1389
diff changeset
28
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
29 private static final Executor exec = Executors.newCachedThreadPool();
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
30 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
31
1563
8fbcc4747091 remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1562
diff changeset
32 private static Runnable runnable(final Luan luan,final LuanFunction fn) {
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
33 return new Runnable() {
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
34 public synchronized void run() {
1563
8fbcc4747091 remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1562
diff changeset
35 LuanLogger.startThreadLogging(luan);
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
36 try {
1563
8fbcc4747091 remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1562
diff changeset
37 fn.call(luan);
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
38 } catch(LuanException e) {
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
39 e.printStackTrace();
1454
219f2b937f2b remove log4j
Franklin Schmidt <fschmidt@gmail.com>
parents: 1443
diff changeset
40 } finally {
219f2b937f2b remove log4j
Franklin Schmidt <fschmidt@gmail.com>
parents: 1443
diff changeset
41 LuanLogger.endThreadLogging();
582
31926755689e add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
42 }
31926755689e add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
43 }
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 }
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
46
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
47 public static void fork(Luan luan,LuanFunction fn) throws LuanException {
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
48 luan = new Luan(luan);
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
49 LuanMutable.makeImmutable(fn);
1563
8fbcc4747091 remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1562
diff changeset
50 exec.execute(runnable(luan,fn));
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
51 }
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
52
1515
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
53 private static final Map<String,ScheduledFuture> scheduleds = new WeakCacheMap<String,ScheduledFuture>();
1401
ef1620aa99cb fix gc issues
Franklin Schmidt <fschmidt@gmail.com>
parents: 1389
diff changeset
54
1440
4e50b78c7040 logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1439
diff changeset
55 private static void cancel(ScheduledFuture sf,String src) {
1439
67bed466460e minor logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1420
diff changeset
56 boolean b = sf.cancel(false);
1443
42c07ecb0ddc DomainHandler
Franklin Schmidt <fschmidt@gmail.com>
parents: 1441
diff changeset
57 if( !sf.isCancelled() )
1441
83e2585104b9 logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1440
diff changeset
58 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
59 }
67bed466460e minor logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1420
diff changeset
60
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
61 public static synchronized void schedule_closure(Luan luan,LuanFunction initFn,LuanTable options)
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
62 throws LuanException
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
63 {
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
64 final Luan newLuan = new Luan(luan);
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
65 LuanMutable.makeImmutable(initFn);
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
66 LuanFunction fn = (LuanFunction)initFn.call(newLuan);
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
67 scheduleFn(luan,newLuan,fn,options);
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
68 }
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
69
1563
8fbcc4747091 remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1562
diff changeset
70 public static synchronized void schedule(Luan luan,LuanFunction fn,LuanTable options)
1301
a9cc35c71eb0 go back to Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
71 throws LuanException
a9cc35c71eb0 go back to Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
72 {
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
73 final Luan newLuan = new Luan(luan);
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
74 LuanMutable.makeImmutable(fn);
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
75 scheduleFn(luan,newLuan,fn,options);
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
76 }
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
77
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
78 private static synchronized void scheduleFn(Luan luan,final Luan newLuan,LuanFunction fn,LuanTable options)
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
79 throws LuanException
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
80 {
1420
225808b90cee options handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1408
diff changeset
81 options = new LuanTable(options);
225808b90cee options handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1408
diff changeset
82 Number delay = Utils.removeNumber(options,"delay");
225808b90cee options handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1408
diff changeset
83 Number repeatingDelay = Utils.removeNumber(options,"repeating_delay");
225808b90cee options handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1408
diff changeset
84 Number repeatingRate = Utils.removeNumber(options,"repeating_rate");
1599
f2a663a4ba9e web logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1578
diff changeset
85 Boolean dontGc = Utils.removeBoolean(options,"dont_gc");
1420
225808b90cee options handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1408
diff changeset
86 String id = Utils.removeString(options,"id");
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
87 if( repeatingDelay!=null && repeatingRate!=null )
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
88 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
89 boolean repeating = repeatingDelay!=null || repeatingRate!=null;
1420
225808b90cee options handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 1408
diff changeset
90 Utils.checkEmpty(options);
1401
ef1620aa99cb fix gc issues
Franklin Schmidt <fschmidt@gmail.com>
parents: 1389
diff changeset
91 if( id != null ) {
1515
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
92 ScheduledFuture sf = scheduleds.remove(id);
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
93 if( sf != null )
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
94 cancel(sf,"id "+id);
1401
ef1620aa99cb fix gc issues
Franklin Schmidt <fschmidt@gmail.com>
parents: 1389
diff changeset
95 }
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
96 final Runnable r = runnable(newLuan,fn);
715
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
97 final ScheduledFuture sf;
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
98 if( repeatingDelay != null ) {
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
99 if( delay==null )
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
100 delay = repeatingDelay;
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
101 sf = scheduler.scheduleWithFixedDelay(r,delay.longValue(),repeatingDelay.longValue(),TimeUnit.MILLISECONDS);
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
102 } else if( repeatingRate != null ) {
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
103 if( delay==null )
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
104 delay = repeatingRate;
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
105 sf = scheduler.scheduleWithFixedDelay(r,delay.longValue(),repeatingRate.longValue(),TimeUnit.MILLISECONDS);
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
106 } else if( delay != null ) {
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
107 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
108 } else {
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
109 scheduler.schedule(r,0L,TimeUnit.MILLISECONDS);
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
110 return;
715
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
111 }
1599
f2a663a4ba9e web logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1578
diff changeset
112 if( !Boolean.TRUE.equals(dontGc) ) {
f2a663a4ba9e web logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1578
diff changeset
113 Object c = new Object() {
f2a663a4ba9e web logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1578
diff changeset
114 protected void finalize() throws Throwable {
f2a663a4ba9e web logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1578
diff changeset
115 cancel(sf,"gc");
f2a663a4ba9e web logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1578
diff changeset
116 }
f2a663a4ba9e web logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1578
diff changeset
117 };
f2a663a4ba9e web logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1578
diff changeset
118 luan.registry().put(c,c); // cancel on gc
f2a663a4ba9e web logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1578
diff changeset
119 }
1401
ef1620aa99cb fix gc issues
Franklin Schmidt <fschmidt@gmail.com>
parents: 1389
diff changeset
120 if( id != null )
1515
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
121 scheduleds.put(id,sf);
715
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
122 }
a82d385ec2c3 add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
123
1104
772d16c89056 add Thread.sleep()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1099
diff changeset
124
772d16c89056 add Thread.sleep()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1099
diff changeset
125 public static void sleep(long millis) throws InterruptedException {
772d16c89056 add Thread.sleep()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1099
diff changeset
126 Thread.sleep(millis);
772d16c89056 add Thread.sleep()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1099
diff changeset
127 }
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
128
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
129
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
130 public static final class Callable {
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
131 private long expires;
1333
25746915a241 merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents: 1330
diff changeset
132 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
133 private final LuanTable fns;
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
134
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
135 Callable(LuanFunction initFn) throws LuanException {
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
136 LuanMutable.makeImmutable(initFn);
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
137 this.fns = (LuanTable)initFn.call(luan);
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
138 }
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
139
1333
25746915a241 merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents: 1330
diff changeset
140 public synchronized Object call(Luan callerLuan,String fnName,Object... args) throws LuanException {
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
141 LuanMutable.makeImmutable(args);
1562
b89212fd04b5 remove table.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1515
diff changeset
142 Object f = fns.get(luan,fnName);
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
143 if( f == null )
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
144 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
145 if( !(f instanceof LuanFunction) )
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
146 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
147 LuanFunction fn = (LuanFunction)f;
1563
8fbcc4747091 remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1562
diff changeset
148 Object rtn = fn.call(luan,args);
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
149 LuanMutable.makeImmutable(rtn);
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
150 return rtn;
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
151 }
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
152 }
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
153
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
154 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
155
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
156 private static void sweep() {
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
157 long now = System.currentTimeMillis();
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
158 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
159 Callable callable = iter.next();
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
160 if( callable.expires < now )
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
161 iter.remove();
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
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
165 public static synchronized Callable globalCallable(String name,LuanFunction initFn,long timeout) throws LuanException {
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
166 Callable callable = callableMap.get(name);
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
167 if( callable == null ) {
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
168 sweep();
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1563
diff changeset
169 callable = new Callable(initFn);
1157
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
170 callableMap.put(name,callable);
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
171 }
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
172 callable.expires = System.currentTimeMillis() + timeout;
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
173 return callable;
50879022f49d failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1106
diff changeset
174 }
1159
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1157
diff changeset
175
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1157
diff changeset
176 public static synchronized void removeGlobalCallable(String name) {
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1157
diff changeset
177 callableMap.remove(name);
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1157
diff changeset
178 }
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1157
diff changeset
179
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
180
1563
8fbcc4747091 remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1562
diff changeset
181 public static Object runInLock(Luan luan,Lock lock,long timeout,LuanFunction fn,Object... args)
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
182 throws LuanException, InterruptedException
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
183 {
1515
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
184 if( !lock.tryLock(timeout,TimeUnit.MILLISECONDS) )
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
185 throw new LuanException("failed to acquire lock");
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
186 try {
1563
8fbcc4747091 remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1562
diff changeset
187 return fn.call(luan,args);
1366
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
188 } finally {
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
189 lock.unlock();
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
190 }
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
191 }
ae2321a09723 improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents: 1335
diff changeset
192
1515
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
193 private static final Map<String,Lock> locks = new WeakCacheMap<String,Lock>();
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
194
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
195 public static synchronized Lock getLock(String key) {
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
196 Lock lock = locks.get(key);
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
197 if( lock == null ) {
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
198 lock = new ReentrantLock();
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
199 locks.put(key,lock);
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
200 }
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
201 return lock;
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
202 }
78d937870762 Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents: 1454
diff changeset
203
126
0149bdf98fd8 add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
204 }