Split up tryToCompletePhase() 77/87777/1
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 14 Feb 2020 09:52:07 +0000 (10:52 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 16 Feb 2020 09:45:22 +0000 (10:45 +0100)
This method is incredibly hot, split it up so that it is easier
to optimize as well as profile.

JIRA: YANGTOOLS-652
Change-Id: I3f87a00061c5f45f80364de3ba1a249beaa25b7f
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java

index 9911d4323b627beb2f98dba1689898557d94588a..cf74e088acd5d33bd373bb839aca70b247b89ca2 100644 (file)
@@ -527,49 +527,56 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
     }
 
     /**
-     * tries to execute current {@link ModelProcessingPhase} of source parsing.
+     * Try to execute current {@link ModelProcessingPhase} of source parsing.
      *
-     * @param phase
-     *            to be executed (completed)
+     * @param phase to be executed (completed)
      * @return if phase was successfully completed
-     * @throws SourceException
-     *             when an error occurred in source parsing
+     * @throws SourceException when an error occurred in source parsing
      */
-    boolean tryToCompletePhase(final ModelProcessingPhase phase) {
-
-        boolean finished = true;
-        final Collection<ContextMutation> openMutations = phaseMutation.get(phase);
-        if (!openMutations.isEmpty()) {
-            final Iterator<ContextMutation> it = openMutations.iterator();
-            while (it.hasNext()) {
-                final ContextMutation current = it.next();
-                if (current.isFinished()) {
-                    it.remove();
-                } else {
-                    finished = false;
-                }
-            }
-
-            if (openMutations.isEmpty()) {
-                phaseMutation.removeAll(phase);
-                if (phaseMutation.isEmpty()) {
-                    phaseMutation = ImmutableMultimap.of();
-                }
-            }
+    final boolean tryToCompletePhase(final ModelProcessingPhase phase) {
+        final boolean finished = phaseMutation.isEmpty() ? true : runMutations(phase);
+        if (completeChildren(phase) && finished) {
+            onPhaseCompleted(phase);
+            return true;
         }
+        return false;
+    }
 
+    private boolean completeChildren(final ModelProcessingPhase phase) {
+        boolean finished = true;
         for (final StatementContextBase<?, ?, ?> child : mutableDeclaredSubstatements()) {
             finished &= child.tryToCompletePhase(phase);
         }
         for (final StatementContextBase<?, ?, ?> child : effective) {
             finished &= child.tryToCompletePhase(phase);
         }
+        return finished;
+    }
 
-        if (finished) {
-            onPhaseCompleted(phase);
-            return true;
+    private boolean runMutations(final ModelProcessingPhase phase) {
+        final Collection<ContextMutation> openMutations = phaseMutation.get(phase);
+        return openMutations.isEmpty() ? true : runMutations(phase, openMutations);
+    }
+
+    private boolean runMutations(final ModelProcessingPhase phase, final Collection<ContextMutation> openMutations) {
+        boolean finished = true;
+        final Iterator<ContextMutation> it = openMutations.iterator();
+        while (it.hasNext()) {
+            final ContextMutation current = it.next();
+            if (current.isFinished()) {
+                it.remove();
+            } else {
+                finished = false;
+            }
         }
-        return false;
+
+        if (openMutations.isEmpty()) {
+            phaseMutation.removeAll(phase);
+            if (phaseMutation.isEmpty()) {
+                phaseMutation = ImmutableMultimap.of();
+            }
+        }
+        return finished;
     }
 
     /**