Mercurial Hosting > luan
annotate src/luan/modules/ThreadLuan.java @ 1202:d3a3ca116e42
gc site instances
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 05 Mar 2018 19:30:51 -0700 |
parents | 7ef40e1923b7 |
children | 3ffc7c4a3b85 |
rev | line source |
---|---|
167
4c0131c2b650
merge luan/lib into modules
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
142
diff
changeset
|
1 package luan.modules; |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
3 import java.io.Closeable; |
1166
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1159
diff
changeset
|
4 import java.util.Arrays; |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
5 import java.util.Iterator; |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
6 import java.util.Map; |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
7 import java.util.HashMap; |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
8 import java.util.LinkedHashMap; |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
9 import java.util.concurrent.Executor; |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
10 import java.util.concurrent.Executors; |
1106
151dc95f5e73
make thread scheduler public
Franklin Schmidt <fschmidt@gmail.com>
parents:
1104
diff
changeset
|
11 import java.util.concurrent.ScheduledThreadPoolExecutor; |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
12 import java.util.concurrent.ScheduledFuture; |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
13 import java.util.concurrent.TimeUnit; |
221
ec016471c6eb
make LuanTable an interface
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
14 import luan.Luan; |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
15 import luan.LuanState; |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
16 import luan.LuanFunction; |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
17 import luan.LuanTable; |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
18 import luan.LuanException; |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
19 import luan.LuanCloner; |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
20 |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
21 |
168
ebe9db183eb7
rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
167
diff
changeset
|
22 public final class ThreadLuan { |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
23 private static final Executor exec = Executors.newCachedThreadPool(); |
1106
151dc95f5e73
make thread scheduler public
Franklin Schmidt <fschmidt@gmail.com>
parents:
1104
diff
changeset
|
24 public static final ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(1); |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
25 |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
26 public static void fork(LuanState luan,LuanFunction fn,Object... args) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
782
diff
changeset
|
27 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
28 final LuanState newLuan = (LuanState)cloner.clone(luan); |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
301
diff
changeset
|
29 final LuanFunction newFn = (LuanFunction)cloner.get(fn); |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
30 final Object[] newArgs = cloner.clone(args); |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
31 exec.execute(new Runnable(){public void run() { |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
32 try { |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
433
diff
changeset
|
33 newFn.call(newLuan,newArgs); |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
34 } catch(LuanException e) { |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
35 e.printStackTrace(); |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
36 } |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
37 }}); |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
38 } |
788
c9409e28daa2
remove Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
39 /* |
582
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
40 public static LuanFunction synchronized_(final LuanState luan,final LuanFunction fn) throws LuanException { |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
582
diff
changeset
|
41 Utils.checkNotNull(fn); |
582
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
42 return new LuanFunction() { |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
43 @Override public Object call(LuanState ingored,Object[] args) throws LuanException { |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
44 synchronized(luan) { |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
45 return fn.call(luan,args); |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
46 } |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
47 } |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
48 }; |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
49 } |
788
c9409e28daa2
remove Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
50 */ |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
51 public static void schedule(LuanState luan,long delay,boolean repeat,LuanFunction fn,Object... args) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
782
diff
changeset
|
52 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
53 final LuanState newLuan = (LuanState)cloner.clone(luan); |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
54 final LuanFunction newFn = (LuanFunction)cloner.get(fn); |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
55 final Object[] newArgs = cloner.clone(args); |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
56 Runnable r = new Runnable(){public void run() { |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
57 try { |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
58 newFn.call(newLuan,newArgs); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
59 } catch(LuanException e) { |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
60 e.printStackTrace(); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
61 } |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
62 }}; |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
63 final ScheduledFuture sf; |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
64 if( repeat ) { |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
65 sf = scheduler.scheduleWithFixedDelay(r,delay,delay,TimeUnit.MILLISECONDS); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
66 } else { |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
67 sf = scheduler.schedule(r,delay,TimeUnit.MILLISECONDS); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
68 } |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
69 final Closeable c = new Closeable(){public void close(){ |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
70 boolean b = sf.cancel(false); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
71 }}; |
1202 | 72 newLuan.registry().put(luan,luan); // prevent gc |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
73 luan.registry().put(c,c); // prevent gc |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
74 luan.onClose(c); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
75 } |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
76 |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
77 /* |
1099
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
78 public static class GlobalMap { |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
79 |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
80 private static class Value { |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
81 final long time = System.currentTimeMillis(); |
1099
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
82 final Object v; |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
83 |
1099
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
84 Value(Object v) { |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
85 this.v = v; |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
86 } |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
87 } |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
88 |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
89 public long timeout = 60000L; // one minute |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
90 private Map<String,Value> map = new LinkedHashMap<String,Value>() { |
1080 | 91 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
|
92 return eldest.getValue().time < System.currentTimeMillis() - timeout; |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
93 } |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
94 }; |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
95 |
1099
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
96 public synchronized Object get(String key) { |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
97 Value val = map.get(key); |
1099
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
98 return val==null ? null : val.v; |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
99 } |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
100 |
1099
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
101 public synchronized Object put(String key,Object v) throws LuanException { |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
102 Value val; |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
103 if( v == null ) { |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
104 val = map.remove(key); |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
105 } else { |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
106 if( !(v instanceof String || v instanceof Boolean || v instanceof Number) ) |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
107 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
|
108 val = map.put(key,new Value(v)); |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
109 } |
a5406f076726
improve Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
110 return val==null ? null : val.v; |
794
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
111 } |
f16c77ef0f4f
add Parsers.json_string and Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
788
diff
changeset
|
112 } |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
113 */ |
1104 | 114 |
115 public static void sleep(long millis) throws InterruptedException { | |
116 Thread.sleep(millis); | |
117 } | |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
118 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
119 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
120 private static boolean isPrimitive(Object v) { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
121 if( v instanceof Object[] ) { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
122 Object[] a = (Object[])v; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
123 for( Object obj : a ) { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
124 if( !isPrimitive(obj) ) |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
125 return false; |
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 return true; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
128 } else { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
129 return v==null || v instanceof String || v instanceof Boolean || v instanceof Number; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
130 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
131 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
132 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
133 public static final class Callable { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
134 private long expires; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
135 private final LuanState luan = new LuanState(); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
136 private final LuanTable fns; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
137 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
138 Callable(LuanState luan,LuanTable fns) { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
139 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
|
140 this.fns = (LuanTable)cloner.get(fns); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
141 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
142 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
143 public synchronized Object call(String fnName,Object... args) throws LuanException { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
144 if( !isPrimitive(args) ) |
1166
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1159
diff
changeset
|
145 throw new LuanException("can't pass non-primitive type to global_callable "+Arrays.asList(args)); |
1157
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
146 Object f = fns.get(luan,fnName); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
147 if( f == null ) |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
148 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
|
149 if( !(f instanceof LuanFunction) ) |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
150 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
|
151 LuanFunction fn = (LuanFunction)f; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
152 Object rtn = fn.call(luan,args); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
153 if( !isPrimitive(rtn) ) |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
154 throw new LuanException("can't return non-primitive type from global_callable"); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
155 return rtn; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
156 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
157 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
158 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
159 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
|
160 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
161 private static void sweep() { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
162 long now = System.currentTimeMillis(); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
163 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
|
164 Callable callable = iter.next(); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
165 if( callable.expires < now ) |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
166 iter.remove(); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
167 } |
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 |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
170 public static synchronized Callable globalCallable(LuanState luan,String name,long timeout,LuanTable fns) { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
171 Callable callable = callableMap.get(name); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
172 if( callable == null ) { |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
173 sweep(); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
174 callable = new Callable(luan,fns); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
175 callableMap.put(name,callable); |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
176 } |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
177 callable.expires = System.currentTimeMillis() + timeout; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
178 return callable; |
50879022f49d
failed attempt to remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1106
diff
changeset
|
179 } |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
180 |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
181 public static synchronized void removeGlobalCallable(String name) { |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
182 callableMap.remove(name); |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
183 } |
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1157
diff
changeset
|
184 |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
185 } |