Changeset 95:8c260716cbb4 in finroc_plugins_parameters


Ignore:
Timestamp:
25.03.2021 08:04:48 (4 weeks ago)
Author:
Max Reichardt <max.reichardt@…>
Branch:
17.03
Phase:
public
Tags:
tip
Message:

Prevents recursive calls to components' 'OnStaticParameterChange' callback

File:
1 edited

Legend:

Unmodified
Added
Removed
  • internal/tStaticParameterList.cpp

    r83 r95  
    7575// Implementation 
    7676//---------------------------------------------------------------------- 
     77 
     78namespace 
     79{ 
     80 
     81std::vector<core::tFrameworkElement*>& ElementsInStaticParameterEvaluation() 
     82{ 
     83  static std::vector<core::tFrameworkElement*> list; 
     84  return list; 
     85} 
     86 
     87} 
     88 
    7789 
    7890tStaticParameterList::tStaticParameterList() : 
     
    194206{ 
    195207  rrlib::thread::tLock lock2(fe.GetStructureMutex()); 
    196  
    197   // all parameters attached to any of the module's parameters 
    198   std::vector<tStaticParameterImplementationBase*> attached_parameters; 
    199   std::vector<tStaticParameterImplementationBase*> attached_parameters_tmp; 
    200  
    201   tStaticParameterList* spl = fe.GetAnnotation<tStaticParameterList>(); 
    202   if (spl) 
    203   { 
    204  
    205     // Reevaluate parameters and check whether they have changed 
    206     bool changed = false; 
    207     for (size_t i = 0; i < spl->Size(); i++) 
    208     { 
    209       spl->Get(i).LoadValue(); 
    210       changed |= spl->Get(i).HasChanged(); 
    211       spl->Get(i).GetAllAttachedParameters(attached_parameters_tmp); 
    212       attached_parameters.insert(attached_parameters.end(), attached_parameters_tmp.begin(), attached_parameters_tmp.end()); 
    213     } 
    214  
    215     if (changed) 
    216     { 
    217       fe.OnStaticParameterChange(); 
    218       for (auto listener : spl->listeners) 
    219       { 
    220         listener->OnStaticParameterChange(); 
    221       } 
    222  
    223       // Reset change flags for all parameters 
     208  auto& in_static_parameter_evaluation = ElementsInStaticParameterEvaluation(); 
     209  if (std::find(in_static_parameter_evaluation.begin(), in_static_parameter_evaluation.end(), &fe) != in_static_parameter_evaluation.end()) 
     210  { 
     211    return; 
     212  } 
     213  in_static_parameter_evaluation.push_back(&fe); 
     214 
     215  try 
     216  { 
     217    // all parameters attached to any of the module's parameters 
     218    std::vector<tStaticParameterImplementationBase*> attached_parameters; 
     219    std::vector<tStaticParameterImplementationBase*> attached_parameters_tmp; 
     220 
     221    tStaticParameterList* spl = fe.GetAnnotation<tStaticParameterList>(); 
     222    if (spl) 
     223    { 
     224 
     225      // Reevaluate parameters and check whether they have changed 
     226      bool changed = false; 
    224227      for (size_t i = 0; i < spl->Size(); i++) 
    225228      { 
    226         spl->Get(i).ResetChanged(); 
    227       } 
    228  
    229       // initialize any new child elements 
    230       if (fe.IsReady()) 
    231       { 
    232         fe.Init(); 
    233       } 
    234     } 
    235   } 
    236  
    237   // evaluate children's static parameters 
    238   for (auto it = fe.ChildrenBegin(); it != fe.ChildrenEnd(); ++it) 
    239   { 
    240     // follow only primary links 
    241     if ((it->GetParent() == &fe) && (!it->IsDeleted())) 
    242     { 
    243       DoStaticParameterEvaluation(*it); 
    244     } 
    245   } 
    246  
    247   // evaluate any attached parameters that have changed, too 
    248   for (size_t i = 0; i < attached_parameters.size(); i++) 
    249   { 
    250     if (attached_parameters[i]->HasChanged()) 
    251     { 
    252       DoStaticParameterEvaluation(*attached_parameters[i]->GetParentList()->GetAnnotated()); 
    253     } 
    254   } 
     229        spl->Get(i).LoadValue(); 
     230        changed |= spl->Get(i).HasChanged(); 
     231        spl->Get(i).GetAllAttachedParameters(attached_parameters_tmp); 
     232        attached_parameters.insert(attached_parameters.end(), attached_parameters_tmp.begin(), attached_parameters_tmp.end()); 
     233      } 
     234 
     235      if (changed) 
     236      { 
     237        fe.OnStaticParameterChange(); 
     238        for (auto listener : spl->listeners) 
     239        { 
     240          listener->OnStaticParameterChange(); 
     241        } 
     242 
     243        // Reset change flags for all parameters 
     244        for (size_t i = 0; i < spl->Size(); i++) 
     245        { 
     246          spl->Get(i).ResetChanged(); 
     247        } 
     248 
     249        // initialize any new child elements 
     250        if (fe.IsReady()) 
     251        { 
     252          fe.Init(); 
     253        } 
     254      } 
     255    } 
     256 
     257    // evaluate children's static parameters 
     258    for (auto it = fe.ChildrenBegin(); it != fe.ChildrenEnd(); ++it) 
     259    { 
     260      // follow only primary links 
     261      if ((it->GetParent() == &fe) && (!it->IsDeleted())) 
     262      { 
     263        DoStaticParameterEvaluation(*it); 
     264      } 
     265    } 
     266 
     267    // evaluate any attached parameters that have changed, too 
     268    for (size_t i = 0; i < attached_parameters.size(); i++) 
     269    { 
     270      if (attached_parameters[i]->HasChanged()) 
     271      { 
     272        DoStaticParameterEvaluation(*attached_parameters[i]->GetParentList()->GetAnnotated()); 
     273      } 
     274    } 
     275  } 
     276  catch (const std::exception& e) 
     277  { 
     278    FINROC_LOG_PRINT_STATIC(ERROR, "Static parameter evaluation failed in '", fe, "': ", e); 
     279  } 
     280 
     281  assert(in_static_parameter_evaluation.size() && in_static_parameter_evaluation.back() == &fe); 
     282  in_static_parameter_evaluation.pop_back(); 
    255283} 
    256284 
Note: See TracChangeset for help on using the changeset viewer.