ovidiu 01/12/16 23:02:37 Modified: scratchpad/schecoon/src/org/apache/cocoon/scheme/servlet REPLGenericServlet.java Log: Use a pool of interpreters to handle multi-threading. This is based on the new SISC model of one interpreter per thread. Revision Changes Path 1.3 +67 -50 xml-cocoon2/scratchpad/schecoon/src/org/apache/cocoon/scheme/servlet/REPLGenericServlet.java Index: REPLGenericServlet.java =================================================================== RCS file: /home/cvs/xml-cocoon2/scratchpad/schecoon/src/org/apache/cocoon/scheme/servlet/REPLGenericServlet.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- REPLGenericServlet.java 2001/12/12 17:34:00 1.2 +++ REPLGenericServlet.java 2001/12/17 07:02:37 1.3 @@ -8,6 +8,8 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; +import java.lang.NumberFormatException; +import java.util.Stack; import java.util.zip.GZIPInputStream; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; @@ -15,12 +17,17 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; +import sisc.AppContext; import sisc.ContinuationException; +import sisc.DynamicEnv; import sisc.Interpreter; +import sisc.data.Expression; import sisc.data.InputPort; import sisc.data.OutputPort; import sisc.data.Symbol; import sisc.data.Value; +import sisc.exprs.AppExp; +import sisc.exprs.FreeReferenceExp; import sisc.modules.J2S; /** @@ -32,66 +39,76 @@ */ public class REPLGenericServlet extends HttpServlet { - protected Interpreter interpreter; + static final String appCtxAttrName = "sisc scheme interpreter context"; protected ServletContext servletContext; protected String initExpression; protected String destroyExpression; - protected String mainExpression; + protected Symbol mainFunction; + protected Stack interPool; public void init(ServletConfig config) throws ServletException { super.init(config); servletContext = config.getServletContext(); + interPool = new Stack(); + Interpreter interp; + synchronized (servletContext) { - String attributeName = "sisc scheme interpreter"; + AppContext ctx = (AppContext)servletContext.getAttribute(appCtxAttrName); + + if (ctx == null) { + ctx = new AppContext(); + servletContext.setAttribute(appCtxAttrName, ctx); + + interp = getInterpreter(); + // Read the heap file + String realPath = servletContext.getRealPath("/"); + String heapFileName = realPath + config.getInitParameter("heap"); + System.out.println("loading heap " + heapFileName); + File heapFile = new File(heapFileName); + + try { + FileInputStream fis = new FileInputStream(heapFileName); + BufferedInputStream bis + = new BufferedInputStream(fis, (int)heapFile.length()); + GZIPInputStream gzis = new GZIPInputStream(bis); + DataInputStream dis + = new DataInputStream(new BufferedInputStream(gzis)); + ctx.loadEnv(interp, dis); + + } catch (IOException ex) { + System.err.println("Error loading heap:" + ex); + ex.printStackTrace(); + throw new ServletException(ex); + } - interpreter = (Interpreter)servletContext.getAttribute(attributeName); - if (interpreter == null) { - interpreter = new Interpreter(System.in, System.out); - servletContext.setAttribute(attributeName, interpreter); + ctx.setEvaluator("eval"); + } + else { + interp = getInterpreter(); } } - interpreter.setEvaluator("eval"); - loadHeap(config.getInitParameter("sisc-heap")); - loadHeap(config.getInitParameter("schecoon-heap")); - initExpression = config.getInitParameter("init-expression"); destroyExpression = config.getInitParameter("destroy-expression"); - mainExpression = config.getInitParameter("main-expression"); + String main = config.getInitParameter("main-function"); + if (main != null) + mainFunction = Symbol.get(main); +// = new FreeReferenceExp(Symbol.get(main), -1, interp.ctx.toplevel_env); // Evaluate the init expression, discard the returned value and // any exception thrown try { if (initExpression != null && !initExpression.equals("")) - interpreter.eval(initExpression); + interp.eval(initExpression); } catch (Exception ex) { System.out.println("Exception evaluating the init expression: " + ex); } - } - - protected void loadHeap(String relativePath) - { - String realPath = servletContext.getRealPath("/"); - String heapFileName = realPath + relativePath; - System.out.println("loading heap " + heapFileName); - File heapFile = new File(heapFileName); - try { - FileInputStream fis = new FileInputStream(heapFileName); - BufferedInputStream bis - = new BufferedInputStream(fis, (int)heapFile.length()); - GZIPInputStream gzis = new GZIPInputStream(bis); - DataInputStream dis = new DataInputStream(new BufferedInputStream(gzis)); - interpreter.loadEnv(dis); - - } catch (IOException e) { - System.err.println("Error loading heap!"); - e.printStackTrace(); - } + releaseInterpreter(interp); } public void destroy() @@ -100,31 +117,31 @@ // any exception thrown try { if (destroyExpression != null && !destroyExpression.equals("")) - interpreter.eval(destroyExpression); + ((Interpreter)interPool.pop()).eval(destroyExpression); } catch (Exception ex) { System.out.println("Exception evaluating the destroy expression: " + ex); } } - public Value eval(String expression, - ServletRequest request, - ServletResponse response) + public Interpreter getInterpreter() { - try { - interpreter.define(Symbol.get("*http-request*"), - new J2S.JavaObject(request), - sisc.Util.TOPLEVEL); - interpreter.define(Symbol.get("*http-response*"), - new J2S.JavaObject(response), - sisc.Util.TOPLEVEL); - Value value = interpreter.eval(expression); - return value; + synchronized(interPool) { + if (!interPool.empty()) + return (Interpreter)interPool.pop(); + + // Create a new interpreter and return it + AppContext ctx = (AppContext)servletContext.getAttribute(appCtxAttrName); + DynamicEnv environment = new DynamicEnv(System.in, System.out); + Interpreter interp = new Interpreter(ctx, environment); + return interp; } - catch (Exception ex) { - System.out.println("evaluation error: " + ex); - ex.printStackTrace(); - return null; + } + + public void releaseInterpreter(Interpreter interp) + { + synchronized(interPool) { + interPool.push(interp); } } }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]