Mercurial Hosting > luan
annotate src/luan/modules/ThreadLuan.java @ 1578:c922446f53aa
immutable threading
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 08 Feb 2021 14:16:19 -0700 |
parents | 8fbcc4747091 |
children | f2a663a4ba9e |
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 | 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 | 20 import luan.LuanMutable; |
1454 | 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 | 27 private static final Logger logger = LoggerFactory.getLogger(ThreadLuan.class); |
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 | 40 } finally { |
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 | 47 public static void fork(Luan luan,LuanFunction fn) throws LuanException { |
48 luan = new Luan(luan); | |
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 | 53 private static final Map<String,ScheduledFuture> scheduleds = new WeakCacheMap<String,ScheduledFuture>(); |
1401 | 54 |
1440 | 55 private static void cancel(ScheduledFuture sf,String src) { |
1439 | 56 boolean b = sf.cancel(false); |
1443 | 57 if( !sf.isCancelled() ) |
1441 | 58 logger.error(src+" cancel="+b+" isCancelled="+sf.isCancelled()+" isDone="+sf.isDone()+" "+sf); |
1439 | 59 } |
60 | |
1578 | 61 public static synchronized void schedule_closure(Luan luan,LuanFunction initFn,LuanTable options) |
62 throws LuanException | |
63 { | |
64 final Luan newLuan = new Luan(luan); | |
65 LuanMutable.makeImmutable(initFn); | |
66 LuanFunction fn = (LuanFunction)initFn.call(newLuan); | |
67 scheduleFn(luan,newLuan,fn,options); | |
68 } | |
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 | 73 final Luan newLuan = new Luan(luan); |
74 LuanMutable.makeImmutable(fn); | |
75 scheduleFn(luan,newLuan,fn,options); | |
76 } | |
77 | |
78 private static synchronized void scheduleFn(Luan luan,final Luan newLuan,LuanFunction fn,LuanTable options) | |
79 throws LuanException | |
80 { | |
1420 | 81 options = new LuanTable(options); |
82 Number delay = Utils.removeNumber(options,"delay"); | |
83 Number repeatingDelay = Utils.removeNumber(options,"repeating_delay"); | |
84 Number repeatingRate = Utils.removeNumber(options,"repeating_rate"); | |
85 String id = Utils.removeString(options,"id"); | |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
86 if( repeatingDelay!=null && repeatingRate!=null ) |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
87 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
|
88 boolean repeating = repeatingDelay!=null || repeatingRate!=null; |
1420 | 89 Utils.checkEmpty(options); |
1401 | 90 if( id != null ) { |
1515 | 91 ScheduledFuture sf = scheduleds.remove(id); |
92 if( sf != null ) | |
93 cancel(sf,"id "+id); | |
1401 | 94 } |
1578 | 95 final Runnable r = runnable(newLuan,fn); |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
96 final ScheduledFuture sf; |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
97 if( repeatingDelay != 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 = repeatingDelay; |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
100 sf = scheduler.scheduleWithFixedDelay(r,delay.longValue(),repeatingDelay.longValue(),TimeUnit.MILLISECONDS); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
101 } else if( repeatingRate != null ) { |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
102 if( delay==null ) |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
103 delay = repeatingRate; |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
104 sf = scheduler.scheduleWithFixedDelay(r,delay.longValue(),repeatingRate.longValue(),TimeUnit.MILLISECONDS); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
105 } else if( delay != null ) { |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
106 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
|
107 } else { |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
108 scheduler.schedule(r,0L,TimeUnit.MILLISECONDS); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
109 return; |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
110 } |
1401 | 111 Object c = new Object() { |
112 protected void finalize() throws Throwable { | |
1440 | 113 cancel(sf,"gc"); |
1401 | 114 } |
115 }; | |
116 luan.registry().put(c,c); // cancel on gc | |
117 if( id != null ) | |
1515 | 118 scheduleds.put(id,sf); |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
119 } |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
120 |
1104 | 121 |
122 public static void sleep(long millis) throws InterruptedException { | |
123 Thread.sleep(millis); | |
124 } | |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
125 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
126 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
127 public static final class Callable { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
128 private long expires; |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
129 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
|
130 private final LuanTable fns; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
131 |
1578 | 132 Callable(LuanFunction initFn) throws LuanException { |
133 LuanMutable.makeImmutable(initFn); | |
134 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
|
135 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
136 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
137 public synchronized Object call(Luan callerLuan,String fnName,Object... args) throws LuanException { |
1578 | 138 LuanMutable.makeImmutable(args); |
1562 | 139 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
|
140 if( f == null ) |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
141 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
|
142 if( !(f instanceof LuanFunction) ) |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
143 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
|
144 LuanFunction fn = (LuanFunction)f; |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
145 Object rtn = fn.call(luan,args); |
1578 | 146 LuanMutable.makeImmutable(rtn); |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
147 return rtn; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
148 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
149 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
150 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
151 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
|
152 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
153 private static void sweep() { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
154 long now = System.currentTimeMillis(); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
155 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
|
156 Callable callable = iter.next(); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
157 if( callable.expires < now ) |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
158 iter.remove(); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
159 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
160 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
161 |
1578 | 162 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
|
163 Callable callable = callableMap.get(name); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
164 if( callable == null ) { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
165 sweep(); |
1578 | 166 callable = new Callable(initFn); |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
167 callableMap.put(name,callable); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
168 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
169 callable.expires = System.currentTimeMillis() + timeout; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
170 return callable; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
171 } |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
172 |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
173 public static synchronized void removeGlobalCallable(String name) { |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
174 callableMap.remove(name); |
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 |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
177 |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
178 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
|
179 throws LuanException, InterruptedException |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
180 { |
1515 | 181 if( !lock.tryLock(timeout,TimeUnit.MILLISECONDS) ) |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
182 throw new LuanException("failed to acquire lock"); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
183 try { |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
184 return fn.call(luan,args); |
1366
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
185 } finally { |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
186 lock.unlock(); |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
187 } |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
188 } |
ae2321a09723
improve Thread.schedule
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
189 |
1515 | 190 private static final Map<String,Lock> locks = new WeakCacheMap<String,Lock>(); |
191 | |
192 public static synchronized Lock getLock(String key) { | |
193 Lock lock = locks.get(key); | |
194 if( lock == null ) { | |
195 lock = new ReentrantLock(); | |
196 locks.put(key,lock); | |
197 } | |
198 return lock; | |
199 } | |
200 | |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
201 } |