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

Reply via email to