Salome HOME
Add parameters 'partition' and 'nodes' for slurm jobs.
[modules/kernel.git] / src / DF / DF_Label.cxx
index 2729f02c5026a3d00a840a27724278e71871bc79..32e95feed0667f72e0d8bf5228e610e98efb1aa0 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -326,10 +326,21 @@ DF_Label DF_Label::FindChild(int theTag, bool isCreate)
     if(_node->_lastChild->_tag < theTag) aPrevious = _node->_lastChild;
   }
   
-  if(!aPrevious) { 
-    aLabel = _node->_firstChild;
+  if ( !aPrevious && _node->_firstChild )
+  {
+    // IPAL54049: Operations on multiple study objects are very long
+    // Use _node->_firstChild->_previous to store the last found child
+    if ( _node->_firstChild->_previous &&
+         _node->_firstChild->_previous->_tag <= theTag )
+      aLabel = _node->_firstChild->_previous;
+    else
+      aLabel = _node->_firstChild;
+
     while(aLabel) {
-      if(aLabel->_tag == theTag) return DF_Label(aLabel);
+      if(aLabel->_tag == theTag) {
+        _node->_firstChild->_previous = aLabel;
+        return DF_Label(aLabel);
+      }
       if(aLabel->_tag > theTag) {
         aNext = aLabel;
         break;
@@ -374,6 +385,12 @@ DF_Label DF_Label::NewChild()
   return FindChild(tag, true);
 }
 
+//Returns a tag of the last child
+int DF_Label::LastChildTag() const
+{
+  return _node->_lastChild ? _node->_lastChild->_tag : 0;
+}
+
 //Returns a string entry of this Label
 std::string DF_Label::Entry() const
 {