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
[email protected]
https://lists.sourceforge.net/lists/listinfo/vexi-svn