[neurun] Workaround for operand::Set iteration (#3196)
author이한종/동작제어Lab(SR)/Engineer/삼성전자 <hanjoung.lee@samsung.com>
Wed, 17 Oct 2018 01:14:51 +0000 (10:14 +0900)
committer오형석/동작제어Lab(SR)/Staff Engineer/삼성전자 <hseok82.oh@samsung.com>
Wed, 17 Oct 2018 01:14:51 +0000 (10:14 +0900)
`OperandPass` sometimes manipulate the set while iteration, this
workaround forces the `iterate` method to iterate only elements that
has been existed from the beginning of the iteration.

Signed-off-by: Hanjoung Lee <hanjoung.lee@samsung.com>
runtimes/neurun/src/graph/operand/Set.cc

index 60dad23..dff690a 100644 (file)
@@ -57,9 +57,25 @@ void Set::iterate(const std::function<void(const Index &, const Object &)> &fn)
 
 void Set::iterate(const std::function<void(const Index &, Object &)> &fn)
 {
+  // TODO Remove this workaround
+  //      This implementation is a workaround in case of adding operands while iteration
+  //
+  //      // Original Implementation (We probably should be back to this)
+  //      for (auto &e : _objects)
+  //      {
+  //        fn(e.first, *e.second);
+  //      }
+
+  std::list<Index> l;
+
   for (auto &e : _objects)
   {
-    fn(e.first, *e.second);
+    l.push_back(e.first);
+  }
+
+  for (auto index : l)
+  {
+    fn(index, *_objects[index]);
   }
 }