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;