Do not retain reference to StatementMap 77/97377/1
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 2 Sep 2021 16:28:38 +0000 (18:28 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 2 Sep 2021 16:28:38 +0000 (18:28 +0200)
Once we have finished iterating, we do not need to retain a reference to
the StatementMap. Promote Regular's iterator to a named class and clear
the reference as soon as we are done. Eliminates a YKP's report of a
possible leak.

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

index d837b93ba6e5ad9a6d494a2bf0d0491794f45345..7c3528aced03d215b4ac7939792733e9d4d9d5d8 100644 (file)
@@ -135,21 +135,29 @@ abstract class StatementMap extends AbstractCollection<AbstractResumedStatement<
 
         @Override
         public Iterator<AbstractResumedStatement<?, ?, ?>> iterator() {
-            return new AbstractIterator<>() {
-                private int nextOffset = 0;
-
-                @Override
-                protected AbstractResumedStatement<?, ?, ?> computeNext() {
-                    while (nextOffset < elements.length) {
-                        final AbstractResumedStatement<?, ?, ?> ret = elements[nextOffset++];
-                        if (ret != null) {
-                            return ret;
-                        }
-                    }
+            return new Iter(this);
+        }
+
+        private static final class Iter extends AbstractIterator<AbstractResumedStatement<?, ?, ?>> {
+            private int nextOffset = 0;
+            private Regular map;
+
+            Iter(final Regular map) {
+                this.map = requireNonNull(map);
+            }
 
-                    return endOfData();
+            @Override
+            protected AbstractResumedStatement<?, ?, ?> computeNext() {
+                while (nextOffset < map.elements.length) {
+                    final AbstractResumedStatement<?, ?, ?> ret = map.elements[nextOffset++];
+                    if (ret != null) {
+                        return ret;
+                    }
                 }
-            };
+
+                map = null;
+                return endOfData();
+            }
         }
     }