package com.nerdscentral.sython; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.python.core.PyDictionary; import org.python.core.PyObject; import org.python.util.PythonInterpreter; import com.nerdscentral.audio.core.SFConstants; import com.nerdscentral.audio.utilities.SFP_DBs; import com.nerdscentral.audio.utilities.SFP_Pcnt; public class Sython { private static StringBuilder initCode = new StringBuilder(); private static void init(String what) { initCode.append(what); initCode.append(System.lineSeparator()); } @SuppressWarnings("nls") public static void main(String[] args) { try { // Launch Thread Watchdog. // Checks for deadlocks IFF the property SFConstants.FIND_DEADLOCKS is set. if (SFConstants.FIND_DEADLOCKS) { findDeadlocks(); } // Create Java/Jython interface // ============================ try ( InputStream sis = Sython.class.getClassLoader().getResourceAsStream("com/nerdscentral/sython/sython.py"); InputStreamReader sir = new InputStreamReader(sis); BufferedReader bsir = new BufferedReader(sir);) { { String lin = null; while ((lin = bsir.readLine()) != null) { if (lin.trim().length() > 0) { init(lin); } } } } // Load operators // ============== try (PythonInterpreter interp = new PythonInterpreter()) { try ( InputStream pis = Sython.class.getClassLoader() .getResourceAsStream("com/nerdscentral/sython/processors.txt"); InputStreamReader pir = new InputStreamReader(pis); BufferedReader bpir = new BufferedReader(pir);) { String lin = null; HashMap<String, SFPL_Operator> processors = new HashMap<>(); interp.exec("import __builtin__"); while ((lin = bpir.readLine()) != null) { if (lin.trim().length() > 0) { SFPL_Operator op = (SFPL_Operator) Class.forName(lin).newInstance(); String word = op.Word(); processors.put(word, op); init(" def " + word + "(self, input, *args):"); init(" return self.run(\"" + word + "\",input,args)"); init(" __builtin__." + word + "=" + word); } } List<SFPL_Operator> vols = new ArrayList<>(404); vols.addAll(SFP_DBs.getAll()); vols.addAll(SFP_Pcnt.getAll()); for (SFPL_Operator op : vols) { String word = op.Word(); processors.put(word, op); init(" def " + word + "(self, input):"); init(" return self.run(\"" + word + "\",input,[])"); init(" __builtin__." + word + "=" + word); } init(""); System.out.println("Python about to interpret:"); // System.out.println(initCode); interp.exec(initCode.toString()); PyObject pyo = interp.get("SonicField"); PyDictionary pid = new PyDictionary(); pid.putAll(processors); PyObject sf = pyo.__call__(pid); interp.exec("print \"Installing sf object\""); interp.set("sf", sf); interp.exec("__builtin__.sf=sf"); } interp.exec("import __builtin__"); interp.exec("__builtin__.sf=sf"); interp.exec("import sython.concurrent"); interp.exec("print \"Switching To Python Mode\""); interp.exec("print \"========================\""); long t0 = System.currentTimeMillis(); for (String f : args) { interp.exec(f); } interp.exec("sython.concurrent.sf_shutdown()"); interp.exec("print \"========================\""); interp.exec("print \"------- All DONE -------\""); long t1 = System.currentTimeMillis(); System.out.println("Total Processing Took: " + ((t1 - t0) / 1000) + " seconds"); } } catch (Throwable t) { while (t != null) { t.printStackTrace(); t = t.getCause(); } System.exit(1); } System.exit(0); } private static void findDeadlocks() { new Thread(new Runnable() { @Override public void run() { ThreadMXBean bean = ManagementFactory.getThreadMXBean(); while (true) { long[] threadIds = bean.findDeadlockedThreads(); // Returns null if no threads are deadlocked. if (threadIds != null) { System.err.println("DEADLOCK"); System.err.println("========"); ThreadInfo[] infos = bean.getThreadInfo(threadIds); for (ThreadInfo info : infos) { System.err.println("STACK:"); StackTraceElement[] stack = info.getStackTrace(); for (StackTraceElement x : stack) { System.err.println(" " + x); } } System.exit(1); } try { Thread.sleep(1000); } catch (InterruptedException e) { // nop } } } }).start(); } }