Clazz.declarePackage ("JS"); Clazz.load (["J.api.JmolParallelProcessor", "JS.ScriptFunction", "JU.Lst"], "JS.ScriptParallelProcessor", ["java.util.concurrent.Executors", "JS.ScriptProcess", "$.ScriptProcessRunnable", "J.shape.MeshCollection", "JU.Logger", "JV.ShapeManager", "$.Viewer"], function () { c$ = Clazz.decorateAsClass (function () { this.vwr = null; this.counter = 0; this.error = null; this.lock = null; this.processes = null; Clazz.instantialize (this, arguments); }, JS, "ScriptParallelProcessor", JS.ScriptFunction, J.api.JmolParallelProcessor); Clazz.prepareFields (c$, function () { this.lock = new Clazz._O (); this.processes = new JU.Lst (); }); Clazz.makeConstructor (c$, function () { Clazz.superConstructor (this, JS.ScriptParallelProcessor, []); }); Clazz.overrideMethod (c$, "getExecutor", function () { return java.util.concurrent.Executors.newCachedThreadPool (); }); Clazz.overrideMethod (c$, "runAllProcesses", function (vwr) { if (this.processes.size () == 0) return; this.vwr = vwr; var inParallel = !vwr.isParallel () && vwr.setParallel (true); var vShapeManagers = new JU.Lst (); this.error = null; this.counter = 0; if (JU.Logger.debugging) JU.Logger.debug ("running " + this.processes.size () + " processes on " + JV.Viewer.nProcessors + " processesors inParallel=" + inParallel); this.counter = this.processes.size (); for (var i = this.processes.size (); --i >= 0; ) { var sm = null; if (inParallel) { sm = new JV.ShapeManager (vwr); sm.setParallel (); vShapeManagers.addLast (sm); }this.runProcess (this.processes.removeItemAt (0), sm); } { while (this.counter > 0) { try { this.lock.wait (); } catch (e) { if (Clazz.exceptionOf (e, InterruptedException)) { } else { throw e; } } if (this.error != null) throw this.error; } }this.mergeResults (vShapeManagers); vwr.setParallel (false); }, "JV.Viewer"); Clazz.defineMethod (c$, "mergeResults", function (vShapeManagers) { try { for (var i = 0; i < vShapeManagers.size (); i++) this.mergeShapes (vShapeManagers.get (i)); } catch (e) { if (Clazz.exceptionOf (e, Error)) { throw e; } else { throw e; } } finally { this.counter = -1; vShapeManagers = null; } }, "JU.Lst"); Clazz.defineMethod (c$, "mergeShapes", function (shapeManager) { var newShapes = shapeManager.shapes; if (newShapes == null) return; if (this.vwr.shm.shapes == null) this.vwr.shm.shapes = newShapes; else for (var i = 0; i < newShapes.length; ++i) if (newShapes[i] != null && Clazz.instanceOf (newShapes[i], J.shape.MeshCollection)) { if (this.vwr.shm.shapes[i] == null) this.vwr.shm.loadShape (i); (this.vwr.shm.shapes[i]).merge (newShapes[i]); } }, "JV.ShapeManager"); Clazz.defineMethod (c$, "clearShapeManager", function (er) { { this.error = er; this.notifyAll (); }}, "Error"); Clazz.overrideMethod (c$, "addProcess", function (name, context) { this.processes.addLast ( new JS.ScriptProcess (name, context)); }, "~S,JS.ScriptContext"); Clazz.defineMethod (c$, "runProcess", function (process, shapeManager) { var r = new JS.ScriptProcessRunnable (this, process, this.lock, shapeManager); var exec = (shapeManager == null ? null : this.getMyExecutor ()); if (exec != null) { exec.execute (r); } else { r.run (); }}, "JS.ScriptProcess,JV.ShapeManager"); Clazz.defineMethod (c$, "eval", function (context, shapeManager) { this.vwr.evalParallel (context, shapeManager); }, "JS.ScriptContext,JV.ShapeManager"); Clazz.defineMethod (c$, "getMyExecutor", function () { if (this.vwr.executor != null || JV.Viewer.nProcessors < 2) return this.vwr.executor; try { this.vwr.executor = this.getExecutor (); } catch (e$$) { if (Clazz.exceptionOf (e$$, Exception)) { var e = e$$; { this.vwr.executor = null; } } else if (Clazz.exceptionOf (e$$, Error)) { var er = e$$; { this.vwr.executor = null; } } else { throw e$$; } } if (this.vwr.executor == null) JU.Logger.error ("parallel processing is not available"); return this.vwr.executor; }); });