Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bc265564 authored by Jason Sams's avatar Jason Sams Committed by Android Git Automerger
Browse files

am 08dd6d1f: am 56754193: Merge "Fix cycle detection for SGs." into jb-mr1-dev

* commit '08dd6d1f':
  Fix cycle detection for SGs.
parents 3f409268 08dd6d1f
Loading
Loading
Loading
Loading
+13 −29
Original line number Original line Diff line number Diff line
@@ -77,7 +77,6 @@ public final class ScriptGroup extends BaseObj {
        ArrayList<Script.KernelID> mKernels = new ArrayList<Script.KernelID>();
        ArrayList<Script.KernelID> mKernels = new ArrayList<Script.KernelID>();
        ArrayList<ConnectLine> mInputs = new ArrayList<ConnectLine>();
        ArrayList<ConnectLine> mInputs = new ArrayList<ConnectLine>();
        ArrayList<ConnectLine> mOutputs = new ArrayList<ConnectLine>();
        ArrayList<ConnectLine> mOutputs = new ArrayList<ConnectLine>();
        boolean mSeen;
        int dagNumber;
        int dagNumber;


        Node mNext;
        Node mNext;
@@ -176,39 +175,24 @@ public final class ScriptGroup extends BaseObj {
            mRS = rs;
            mRS = rs;
        }
        }


        private void validateCycleRecurse(Node n, int depth) {
        // do a DFS from original node, looking for original node
            n.mSeen = true;
        // any cycle that could be created must contain original node

        private void validateCycle(Node target, Node original) {
            //android.util.Log.v("RSR", " validateCycleRecurse outputCount " + n.mOutputs.size());
            for (int ct = 0; ct < target.mOutputs.size(); ct++) {
            for (int ct=0; ct < n.mOutputs.size(); ct++) {
                final ConnectLine cl = target.mOutputs.get(ct);
                final ConnectLine cl = n.mOutputs.get(ct);
                if (cl.mToK != null) {
                if (cl.mToK != null) {
                    Node tn = findNode(cl.mToK.mScript);
                    Node tn = findNode(cl.mToK.mScript);
                    if (tn.mSeen) {
                    if (tn.equals(original)) {
                        throw new RSInvalidStateException("Loops in group not allowed.");
                        throw new RSInvalidStateException("Loops in group not allowed.");
                    }
                    }
                    validateCycleRecurse(tn, depth + 1);
                    validateCycle(tn, original);
                }
                }
                if (cl.mToF != null) {
                if (cl.mToF != null) {
                    Node tn = findNode(cl.mToF.mScript);
                    Node tn = findNode(cl.mToF.mScript);
                    if (tn.mSeen) {
                    if (tn.equals(original)) {
                        throw new RSInvalidStateException("Loops in group not allowed.");
                        throw new RSInvalidStateException("Loops in group not allowed.");
                    }
                    }
                    validateCycleRecurse(tn, depth + 1);
                    validateCycle(tn, original);
                }
            }
        }

        private void validateCycle() {
            //android.util.Log.v("RSR", "validateCycle");

            for (int ct=0; ct < mNodes.size(); ct++) {
                for (int ct2=0; ct2 < mNodes.size(); ct2++) {
                    mNodes.get(ct2).mSeen = false;
                }
                Node n = mNodes.get(ct);
                if (n.mInputs.size() == 0) {
                    validateCycleRecurse(n, 0);
                }
                }
            }
            }
        }
        }
@@ -327,7 +311,7 @@ public final class ScriptGroup extends BaseObj {


            Node nf = findNode(from);
            Node nf = findNode(from);
            if (nf == null) {
            if (nf == null) {
                throw new RSInvalidStateException("From kernel not found.");
                throw new RSInvalidStateException("From script not found.");
            }
            }


            Node nt = findNode(to.mScript);
            Node nt = findNode(to.mScript);
@@ -341,7 +325,7 @@ public final class ScriptGroup extends BaseObj {
            nf.mOutputs.add(cl);
            nf.mOutputs.add(cl);
            nt.mInputs.add(cl);
            nt.mInputs.add(cl);


            validateCycle();
            validateCycle(nf, nf);
            return this;
            return this;
        }
        }


@@ -362,7 +346,7 @@ public final class ScriptGroup extends BaseObj {


            Node nf = findNode(from);
            Node nf = findNode(from);
            if (nf == null) {
            if (nf == null) {
                throw new RSInvalidStateException("From kernel not found.");
                throw new RSInvalidStateException("From script not found.");
            }
            }


            Node nt = findNode(to);
            Node nt = findNode(to);
@@ -376,7 +360,7 @@ public final class ScriptGroup extends BaseObj {
            nf.mOutputs.add(cl);
            nf.mOutputs.add(cl);
            nt.mInputs.add(cl);
            nt.mInputs.add(cl);


            validateCycle();
            validateCycle(nf, nf);
            return this;
            return this;
        }
        }