Mercurial Hosting > luan
comparison src/luan/modules/http/LuanHandler.java @ 1360:ee0f0e6c89a0
fix reset_luan
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 21 Apr 2019 02:32:41 -0600 |
parents | 9721d4709bfb |
children | 5c3702f60200 |
comparison
equal
deleted
inserted
replaced
1359:9721d4709bfb | 1360:ee0f0e6c89a0 |
---|---|
31 | 31 |
32 | 32 |
33 public final class LuanHandler implements Handler, Luan.OnClose { | 33 public final class LuanHandler implements Handler, Luan.OnClose { |
34 private final Luan luanInit; | 34 private final Luan luanInit; |
35 private final Logger logger; | 35 private final Logger logger; |
36 private final ReadWriteLock lock = new ReentrantReadWriteLock(); | 36 private final ReadWriteLock rwLock = new ReentrantReadWriteLock(); |
37 private final List<Reference<Closeable>> onClose = new ArrayList<Reference<Closeable>>(); | 37 private final List<Reference<Closeable>> onClose = new ArrayList<Reference<Closeable>>(); |
38 private volatile Luan currentLuan; | 38 private volatile Luan currentLuan; |
39 private volatile boolean isDisabled = false; | 39 private volatile boolean isDisabled = false; |
40 | 40 |
41 private static final Method resetLuanMethod; | 41 private static final Method resetLuanMethod; |
98 | 98 |
99 Response handle(Request request,boolean notFound) { | 99 Response handle(Request request,boolean notFound) { |
100 Thread thread = Thread.currentThread(); | 100 Thread thread = Thread.currentThread(); |
101 String oldName = thread.getName(); | 101 String oldName = thread.getName(); |
102 thread.setName(request.headers.get("host")+request.path); | 102 thread.setName(request.headers.get("host")+request.path); |
103 lock.readLock().lock(); | 103 rwLock.readLock().lock(); |
104 try { | 104 try { |
105 return service(request,notFound); | 105 return service(request,notFound); |
106 } catch(LuanException e) { | 106 } catch(LuanException e) { |
107 String err = e.getLuanStackTraceString(); | 107 String err = e.getLuanStackTraceString(); |
108 logger.error(err+"\n"+request.rawHead.trim()+"\n"); | 108 logger.error(err+"\n"+request.rawHead.trim()+"\n"); |
109 String msg = "Internel Server Error\n\n" + err; | 109 String msg = "Internel Server Error\n\n" + err; |
110 return Response.errorResponse( Status.INTERNAL_SERVER_ERROR, msg ); | 110 return Response.errorResponse( Status.INTERNAL_SERVER_ERROR, msg ); |
111 } finally { | 111 } finally { |
112 lock.readLock().unlock(); | 112 rwLock.readLock().unlock(); |
113 thread.setName(oldName); | 113 thread.setName(oldName); |
114 } | 114 } |
115 } | 115 } |
116 | 116 |
117 public void onClose(Closeable c) { | 117 public void onClose(Closeable c) { |
135 onClose.clear(); | 135 onClose.clear(); |
136 } | 136 } |
137 } | 137 } |
138 | 138 |
139 public Object call_rpc(String fnName,Object... args) throws LuanException { | 139 public Object call_rpc(String fnName,Object... args) throws LuanException { |
140 lock.readLock().lock(); | 140 rwLock.readLock().lock(); |
141 try { | 141 try { |
142 LuanFunction fn; | 142 LuanFunction fn; |
143 synchronized(luanInit) { | 143 synchronized(luanInit) { |
144 enableLoad("luan:Rpc.luan"); | 144 enableLoad("luan:Rpc.luan"); |
145 LuanTable rpc = (LuanTable)currentLuan.require("luan:Rpc.luan"); | 145 LuanTable rpc = (LuanTable)currentLuan.require("luan:Rpc.luan"); |
150 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); | 150 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); |
151 fn = (LuanFunction)cloner.get(fn); | 151 fn = (LuanFunction)cloner.get(fn); |
152 } | 152 } |
153 return fn.call(args); | 153 return fn.call(args); |
154 } finally { | 154 } finally { |
155 lock.readLock().unlock(); | 155 rwLock.readLock().unlock(); |
156 } | 156 } |
157 } | 157 } |
158 | 158 |
159 public void reset_luan() { | 159 public void reset_luan() { |
160 lock.writeLock().lock(); | 160 new Thread() {public void run(){ |
161 try { | 161 rwLock.writeLock().lock(); |
162 close(); | 162 try { |
163 currentLuan = newLuan(); | 163 close(); |
164 } finally { | 164 currentLuan = newLuan(); |
165 lock.writeLock().unlock(); | 165 } finally { |
166 } | 166 rwLock.writeLock().unlock(); |
167 } | |
168 }}.start(); | |
167 } | 169 } |
168 | 170 |
169 public void disable_luan() { | 171 public void disable_luan() { |
170 isDisabled = true; | 172 isDisabled = true; |
171 } | 173 } |
172 | 174 |
173 public Object runLuan(String sourceText,String sourceName) throws LuanException { | 175 public Object runLuan(String sourceText,String sourceName) throws LuanException { |
174 lock.readLock().lock(); | 176 rwLock.readLock().lock(); |
175 try { | 177 try { |
176 Luan luan = currentLuan; | 178 Luan luan = currentLuan; |
177 synchronized(luanInit) { | 179 synchronized(luanInit) { |
178 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); | 180 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); |
179 Luan luan2 = (Luan)cloner.clone(luan); | 181 Luan luan2 = (Luan)cloner.clone(luan); |
180 LuanFunction fn = luan2.load(sourceText,sourceName); | 182 LuanFunction fn = luan2.load(sourceText,sourceName); |
181 return fn.call(); | 183 return fn.call(); |
182 } | 184 } |
183 } finally { | 185 } finally { |
184 lock.readLock().unlock(); | 186 rwLock.readLock().unlock(); |
185 } | 187 } |
186 } | 188 } |
187 | 189 |
188 public void eval_in_root(String text) throws LuanException { | 190 public void eval_in_root(String text) throws LuanException { |
189 Luan luan; | 191 Luan luan; |