Revision: 4762 http://sourceforge.net/p/vexi/code/4762 Author: mkpg2 Date: 2015-02-14 21:59:36 +0000 (Sat, 14 Feb 2015) Log Message: ----------- Refactor. Common exception handling for making background calls.
Modified Paths: -------------- branches/vexi3/org.vexi-core.main/src/main/java/org/vexi/core/Resources.java branches/vexi3/org.vexi-core.main/src/main/java/org/vexi/graphics/Picture.java branches/vexi3/org.vexi-core.main/src/main/jpp/org/vexi/core/Vexi.jpp branches/vexi3/org.vexi-library.js/src/main/java/org/ibex/js/Fountain.java branches/vexi3/org.vexi-library.js/src/main/java/org/ibex/js/Scheduler.java branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/Interpreter.jpp branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/XMLRPC.jpp branches/vexi3/org.vexi-library.js/src/poke/java/org/ibex/js/RunJS.java trunk/org.vexi-library.util/src/main/java/org/ibex/util/Callable.java Modified: branches/vexi3/org.vexi-core.main/src/main/java/org/vexi/core/Resources.java =================================================================== --- branches/vexi3/org.vexi-core.main/src/main/java/org/vexi/core/Resources.java 2015-02-14 21:56:23 UTC (rev 4761) +++ branches/vexi3/org.vexi-core.main/src/main/java/org/vexi/core/Resources.java 2015-02-14 21:59:36 UTC (rev 4762) @@ -431,21 +431,12 @@ // FONT STUFF static public void installFont(final JS stream) throws JSExn { - final Callable callback = Main.SCHEDULER.pauseJSThread(); - new java.lang.Thread(new Runnable() { - public void run() { - try { - _installFont(stream); - Main.SCHEDULER.schedule(callback, null); - } catch(JSExn e) { - Main.SCHEDULER.schedule(callback, e); - } catch(Exception e) { - // IMPROVEMENT - JSU.schedule converts over exceptions for us - Main.SCHEDULER.schedule(callback, new JSExn(e.getMessage())); - } - } - }).start(); - + Main.SCHEDULER.backgroundCall("install font", new Callable<Object, JS>() { + public JS run(Object A) throws Exception { + _installFont(stream); + return null; + } + }); } static public void _installFont(JS fontStream) throws Exception { Modified: branches/vexi3/org.vexi-core.main/src/main/java/org/vexi/graphics/Picture.java =================================================================== --- branches/vexi3/org.vexi-core.main/src/main/java/org/vexi/graphics/Picture.java 2015-02-14 21:56:23 UTC (rev 4761) +++ branches/vexi3/org.vexi-core.main/src/main/java/org/vexi/graphics/Picture.java 2015-02-14 21:59:36 UTC (rev 4762) @@ -91,7 +91,7 @@ static public Picture load(JS[] args) throws JSExn { final Scheduler sched = Scheduler.findCurrent(); - final Thread callback = sched.pauseJSThread(); + final Thread callback = sched.pauseJSThread("load picture"); Picture p = Picture.load(args[0], new Callable(){ public Object run(Object o) throws JSExn { Picture p = (Picture)o; Modified: branches/vexi3/org.vexi-core.main/src/main/jpp/org/vexi/core/Vexi.jpp =================================================================== --- branches/vexi3/org.vexi-core.main/src/main/jpp/org/vexi/core/Vexi.jpp 2015-02-14 21:56:23 UTC (rev 4761) +++ branches/vexi3/org.vexi-core.main/src/main/jpp/org/vexi/core/Vexi.jpp 2015-02-14 21:59:36 UTC (rev 4762) @@ -854,27 +854,16 @@ // FEATURE: move this into builtin.vexi // From JS thread. - static private Blessing bless_jsthread(final JS vexi, final JS fountain, final JS name) throws JSExn { - try { - final Callable callback = Main.SCHEDULER.pauseJSThread(); - new java.lang.Thread() { - public void run() { - try { - Fountain f = JSU.getFountain(fountain); - f.cache(f); - Main.SCHEDULER.schedule(callback, bless(vexi,fountain,name)); - } catch(Exception e) { - JSExn jsexn = (e instanceof JSExn) ? (JSExn)e : new JSExn(e); - Main.SCHEDULER.schedule(callback,jsexn); - } - } - }.start(); - return null; // doesn't matter since we paused - } catch (JSExn e) { - throw new JSExn("cannot access a potentially remote resource in the foreground thread"); - } + static private JS bless_jsthread(final JS vexi, final JS fountain, final JS name) throws JSExn { + return Main.SCHEDULER.backgroundCall("bless (resource potentially remote)", new Callable(){ + public Object run(Object A) throws Exception { + Fountain f = JSU.getFountain(fountain); + f.cache(f); + return bless(vexi,fountain,name); + } + }); } - + static private Blessing bless(JS vexi, JS fountain, JS name) throws JSExn { Fountain f = JSU.getFountain(fountain); if (f==null) { Modified: branches/vexi3/org.vexi-library.js/src/main/java/org/ibex/js/Fountain.java =================================================================== --- branches/vexi3/org.vexi-library.js/src/main/java/org/ibex/js/Fountain.java 2015-02-14 21:56:23 UTC (rev 4761) +++ branches/vexi3/org.vexi-library.js/src/main/java/org/ibex/js/Fountain.java 2015-02-14 21:59:36 UTC (rev 4762) @@ -173,17 +173,11 @@ if("info".equals(JSU.toString(method))){ try { final Scheduler sched = Scheduler.findCurrent(); - final Callable callback = sched.pauseJSThread(); - new java.lang.Thread() { public void run() { - try{ - sched.schedule(callback, getInfo()); - }catch(Exception e){ - JSExn jsexn = (e instanceof JSExn)?(JSExn)e: new JSExn(e.getMessage()); - sched.schedule(callback,jsexn); - } - }}.start(); - return null; // doesn't matter since we paused - + return sched.backgroundCall("get fountain info", new Callable<Object, JS>() { + public JS run(Object A) throws Exception { + return getInfo(); + } + }); } catch (JSExn e) { throw new JSExn("cannot access a potentially remote resource in the foreground thread"); } @@ -423,20 +417,17 @@ static final int[] ARGTYPES_2fountains = new int[]{JSU.FOUNTAIN,JSU.FOUNTAIN}; static public void pipe(final JS[] args) throws JSExn{ JSU.checkArgs(args, ARGTYPES_2fountains); - try { - final Scheduler sched = Scheduler.findCurrent(); - final Callable callback = sched.pauseJSThread(); - new java.lang.Thread() { public void run() { + final Scheduler sched = Scheduler.findCurrent(); + sched.backgroundCall("pipe streams", new Callable<Object, JS>() { + public JS run(Object A) throws Exception { try { IOUtil.pipe(((Fountain)args[0]).getInputStream(true), ((Fountain)args[1]).getOutputStream(true)); - sched.schedule(callback, null); + return null; } catch (IOException e) { - sched.schedule(callback, JSU.handleFountainExn(e)); + throw JSU.handleFountainExn(e); } - }}.start(); - } catch (JSExn e) { - throw new JSExn("cannot pipe streams in the foreground thread"); - } + } + }); } static public Fountain newZip(Fountain f) throws IOException{ Modified: branches/vexi3/org.vexi-library.js/src/main/java/org/ibex/js/Scheduler.java =================================================================== --- branches/vexi3/org.vexi-library.js/src/main/java/org/ibex/js/Scheduler.java 2015-02-14 21:56:23 UTC (rev 4761) +++ branches/vexi3/org.vexi-library.js/src/main/java/org/ibex/js/Scheduler.java 2015-02-14 21:59:36 UTC (rev 4762) @@ -398,6 +398,22 @@ return value; } + public JS backgroundCall(final String what, final Callable<Object,JS> callable) throws JSExn{ + final Callable callback = pauseJSThread(what); + new java.lang.Thread() { + public void run() { + try { + JS ret = callable.run(null); + schedule(callback,ret); + }catch(Exception e){ + JSExn jsexn = (e instanceof JSExn) ? (JSExn)e : new JSExn(e); + schedule(callback,jsexn); + } + } + }.start(); + return null; // doesn't matter since we are paused + } + public void scheduleJustTriggerTraps(final JS.Obj obj, final JS key, final JS value) { add(new Callable() { public Object run(Object o) throws Exception { @@ -422,17 +438,13 @@ /** cause the current (background only) thread to sleep for i ms */ public void sleep(final int i) throws JSExn { - try { - final Callable callback = pauseJSThread(); - // schedule negative values (used for yield) immediately - if (i<0) { - add(callback); - } else { - scheduleWakeUp.insert(i, callback); - } - } catch (JSExn e) { - throw new JSExn("You cannot sleep or yield in the foreground thread"); - } + final Callable callback = pauseJSThread("sleep or yield"); + // schedule negative values (used for yield) immediately + if (i<0) { + add(callback); + } else { + scheduleWakeUp.insert(i, callback); + } } /** encapsulates a sleeper thread and its desired wakeup time in milliseconds @@ -503,8 +515,8 @@ // we do not deal with potential parent interpreters when we reschedule. // A JSExn complaining about the foreground thread will be thrown, but this // will not be accurate. (e.g. load template from a background thread) - public Thread pauseJSThread() throws JSExn { - jsthread.currentInterpreter.pause(); + public Thread pauseJSThread(String forwhat) throws JSExn { + jsthread.currentInterpreter.pause(forwhat); return jsthread; } public Interpreter getCurrentInterpreter() { Modified: branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/Interpreter.jpp =================================================================== --- branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/Interpreter.jpp 2015-02-14 21:56:23 UTC (rev 4761) +++ branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/Interpreter.jpp 2015-02-14 21:59:36 UTC (rev 4762) @@ -131,8 +131,8 @@ return run(); } - public void pause() throws JSExn { - if (pausecount == -1 || f == null) throw new JSExn("tried to pause an unpausable thread"); + public void pause(String forwhat) throws JSExn { + if (pausecount == -1 || f == null) throw new JSExn("Cannot "+forwhat+" in foreground thread"); pausecount++; switch(f.op[pc]) { case Tokens.RETURN: case ByteCodes.PUT: get = false; break; Modified: branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/XMLRPC.jpp =================================================================== --- branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/XMLRPC.jpp 2015-02-14 21:56:23 UTC (rev 4761) +++ branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/XMLRPC.jpp 2015-02-14 21:59:36 UTC (rev 4762) @@ -353,23 +353,16 @@ } public final JS call(final JSArray args) throws JSExn { - try { - final Scheduler sched = Scheduler.findCurrent(); - final Callable callback = sched.pauseJSThread(); - new java.lang.Thread() { public void run() { - final Object response = doCall(args); - sched.schedule(callback, response); - }}.start(); - return null; // doesn't matter since we paused - } catch (JSExn e) { - throw new JSExn("cannot invoke an XML-RPC call in the foreground thread"); - } - } + final Scheduler sched = Scheduler.findCurrent(); + return sched.backgroundCall("make XML-RPC call", new Callable<Object, JS>() { + public JS run(Object A) throws Exception { + return doCall(args); + } + }); + } - - - final Object doCall(final JSArray args) { - try { + final JS doCall(final JSArray args) throws JSExn { + try{ if (logger.isDebug()) logger.debug(LOG_TYPE, "call to " + url + " : " + method); if (tracker == null) tracker = new HashMap(); if (objects == null) objects = new Basket.Array(); @@ -377,7 +370,7 @@ if (logger.isDebug()) logger.debug(LOG_TYPE, "send:\n" + request); InputStream is = http.POST("text/xml", request.getBytes(encoding)).body; try { - if(logger.isDebug()){ + if(logger.isDebug() || true){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); IOUtil.pipe(is, baos); byte[] xmlBytes = baos.toByteArray(); @@ -396,7 +389,7 @@ new Helper().parse(is); if (fault) { - return new JSExn(((JS)objects.get(0)).get(SC_faultString),SC_remote); + throw new JSExn(((JS)objects.get(0)).get(SC_faultString),SC_remote); } final JS result = (objects.size() == 0 ? (JS)null : ((JS)objects.get(0))); return result; @@ -411,13 +404,8 @@ logger.warn(XMLRPC.class, e); } } - } catch (final JSExn e) { - return e; - } catch (final Throwable e) { - if (e instanceof IOException) { - return new JSExn(JSU.S(e.getMessage()), SC_xmlrpc); - } - return new JSExn(e); + } catch(IOException e) { + throw new JSExn(JSU.S(e.getMessage()), SC_xmlrpc); } } Modified: branches/vexi3/org.vexi-library.js/src/poke/java/org/ibex/js/RunJS.java =================================================================== --- branches/vexi3/org.vexi-library.js/src/poke/java/org/ibex/js/RunJS.java 2015-02-14 21:56:23 UTC (rev 4761) +++ branches/vexi3/org.vexi-library.js/src/poke/java/org/ibex/js/RunJS.java 2015-02-14 21:59:36 UTC (rev 4762) @@ -400,11 +400,11 @@ return new JSRegexp(args[0], args[1]); } if("pause".equals(methName)){ - final Callable callback = SCHEDULER.pauseJSThread(); + final Callable callback = SCHEDULER.pauseJSThread("pause"); new java.lang.Thread() { public void run() { System.out.println("in pause"); SCHEDULER.schedule(callback, null); - }}.start(); + }}.start(); } if( "xmlrpc".equals(methName)){ return new XMLRPC(LOG, JSU.toString(args[0]), ""); Modified: trunk/org.vexi-library.util/src/main/java/org/ibex/util/Callable.java =================================================================== --- trunk/org.vexi-library.util/src/main/java/org/ibex/util/Callable.java 2015-02-14 21:56:23 UTC (rev 4761) +++ trunk/org.vexi-library.util/src/main/java/org/ibex/util/Callable.java 2015-02-14 21:59:36 UTC (rev 4762) @@ -15,7 +15,7 @@ * @see org.ibex.util.Pausable * */ -public interface Callable { +public interface Callable<A,R> { /** Calls the object with a given argument. */ - public Object run(Object o) throws Exception; + public R run(Object A) throws Exception; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Dive into the World of Parallel Programming. The Go Parallel Website, sponsored by Intel and developed in partnership with Slashdot Media, is your hub for all things parallel software development, from weekly thought leadership blogs to news, videos, case studies, tutorials and more. Take a look and join the conversation now. http://goparallel.sourceforge.net/ _______________________________________________ Vexi-svn mailing list Vexi-svn@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/vexi-svn