Hi Gary,

I think this should work:
for (auto iter = list_of_su.rbegin(); iter != list_of_su.rend(); ++iter) {

but the original code is fine, without the auto declaration.

/Thanks HansN

On 09/18/2015 04:34 PM, Gary Lee wrote:
> Hi Hans
>
> Please see [GL].
>
> Quoting Hans Nordebäck <[email protected]>:
>
>> Hi Gary,
>>
>> ack, one question, please see inline.
>>
>>  /Thanks HansN
>>
>>  /Thanks Hans
>>
>> On 09/17/2015 07:22 AM, Gary Lee wrote:
>>>  osaf/services/saf/amf/amfd/sg.cc |  179 
>>> +++++++++++++++++++-------------------
>>>  1 files changed, 90 insertions(+), 89 deletions(-)
>>>
>>>
>>> diff --git a/osaf/services/saf/amf/amfd/sg.cc 
>>> b/osaf/services/saf/amf/amfd/sg.cc
>>> --- a/osaf/services/saf/amf/amfd/sg.cc
>>> +++ b/osaf/services/saf/amf/amfd/sg.cc
>>> @@ -117,7 +117,6 @@
>>>          sg_fsm_state(AVD_SG_FSM_STABLE),
>>>          admin_si(NULL),
>>>          sg_redundancy_model(SA_AMF_NO_REDUNDANCY_MODEL),
>>> -        list_of_su(NULL),
>>>          list_of_si(NULL),
>>>          sg_type(NULL),
>>>          sg_list_app_next(NULL),
>>> @@ -164,7 +163,7 @@
>>>  void avd_sg_delete(AVD_SG *sg)
>>>  {
>>>      /* by now SU and SI should have been deleted */
>>> -    osafassert(sg->list_of_su == NULL);
>>> +    osafassert(sg->list_of_su.empty() == true);
>>>      osafassert(sg->list_of_si == NULL);
>>>      sg_remove_from_model(sg);
>>>      delete sg;
>>> @@ -757,7 +756,6 @@
>>>   */
>>>  static void sg_nd_attribute_update(AVD_SG *sg, uint32_t attrib_id)
>>>  {
>>> -    AVD_SU *su = NULL;
>>>      AVD_AVND *su_node_ptr = NULL;
>>>      AVSV_PARAM_INFO param;
>>>      memset(((uint8_t *)&param), '\0', sizeof(AVSV_PARAM_INFO));
>>> @@ -809,8 +807,7 @@
>>>      }
>>>        /* This value has to be updated on each SU on this SG */
>>> -    su = sg->list_of_su;
>>> -    while (su) {
>>> +    for (const auto& su : sg->list_of_su) {
>>>          su_node_ptr = su->get_node_ptr();
>>>            if ((su_node_ptr) && (su_node_ptr->node_state == 
>>> AVD_AVND_STATE_PRESENT)) {
>>> @@ -820,7 +817,6 @@
>>>                  LOG_ER("%s::failed for %s",__FUNCTION__, 
>>> su_node_ptr->name.value);
>>>              }
>>>          }
>>> -        su = su->sg_list_su_next;
>>>      }
>>>      TRACE_LEAVE();
>>>  }
>>> @@ -1103,29 +1099,36 @@
>>>    /**
>>>   * Terminate SU in reverse order
>>> - * @param su
>>>   * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE.
>>>   */
>>> -static uint32_t avd_sg_su_term_in_reverse(AVD_SU *su)
>>> +uint32_t AVD_SG::term_su_list_in_reverse()
>>>  {
>>> -  uint32_t rc = NCSCC_RC_SUCCESS;
>>> -  TRACE_ENTER2("su:'%s'", su ? su->name.value : NULL);
>>> -  if (su->sg_list_su_next != NULL)
>>> -    rc = avd_sg_su_term_in_reverse(su->sg_list_su_next);
>>> -  if ((su->saAmfSUPreInstantiable == true) &&
>>> -          (su->saAmfSUPresenceState != 
>>> SA_AMF_PRESENCE_UNINSTANTIATED) &&
>>> -          (su->saAmfSUPresenceState != 
>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED) &&
>>> -          (su->saAmfSUPresenceState != 
>>> SA_AMF_PRESENCE_TERMINATION_FAILED)) {
>>> +    uint32_t rc = NCSCC_RC_SUCCESS;
>>> +    std::vector<AVD_SU*>::const_reverse_iterator iter;
>>> +    AVD_SU *su;
>>>  -      if (avd_snd_presence_msg(avd_cb, su, true) == 
>>> NCSCC_RC_SUCCESS) {
>>> -          su->set_term_state(true);
>>> -      } else {
>>> -          rc = NCSCC_RC_FAILURE;
>>> -          LOG_WA("Failed Termination '%s'", su->name.value);
>>> -      }
>>> -  }
>>> -  TRACE_LEAVE();
>>> -  return rc ;
>>> +    TRACE_ENTER2("sg: %s", this->name.value);
>>> +    for (iter = list_of_su.rbegin(); iter != list_of_su.rend(); 
>>> ++iter) {
>>
>> [HansN] Is there a reason not to use, for (auto iter = .. and skip 
>> const_reverse_iter declaration above?
>>
>
> [GL] I think I would need to write a reverse adaptor like boost has, 
> in order to use a range-based for loop.
> So I just did it quickly with a reverse iterator.
>
>>> +        su = *iter;
>>> +        TRACE("terminate su:'%s'", su ? su->name.value : NULL);
>>> +
>>> +        if ((su->saAmfSUPreInstantiable == true) &&
>>> +            (su->saAmfSUPresenceState != 
>>> SA_AMF_PRESENCE_UNINSTANTIATED) &&
>>> +            (su->saAmfSUPresenceState != 
>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED) &&
>>> +            (su->saAmfSUPresenceState != 
>>> SA_AMF_PRESENCE_TERMINATION_FAILED)) {
>>> +
>>> +            if (avd_snd_presence_msg(avd_cb, su, true) == 
>>> NCSCC_RC_SUCCESS) {
>>> +                su->set_term_state(true);
>>> +            } else {
>>> +                rc = NCSCC_RC_FAILURE;
>>> +                LOG_WA("Failed Termination '%s'", su->name.value);
>>> +            }
>>> +        }
>>> +    }
>>> +
>>> +    TRACE_LEAVE();
>>> +
>>> +    return rc ;
>>>  }
>>>  /**
>>>   * perform lock-instantiation on a given SG
>>> @@ -1139,8 +1142,8 @@
>>>      TRACE_ENTER2("%s", sg->name.value);
>>>        /* terminate all the SUs on this Node */
>>> -    if (sg->list_of_su != NULL)
>>> -        rc = avd_sg_su_term_in_reverse(sg->list_of_su);
>>> +    if (sg->list_of_su.empty() == false)
>>> +        rc = sg->term_su_list_in_reverse();
>>>        TRACE_LEAVE2("%u", rc);
>>>      return rc;
>>> @@ -1154,13 +1157,14 @@
>>>   */
>>>  static void sg_app_sg_admin_unlock_inst(AVD_CL_CB *cb, AVD_SG *sg)
>>>  {
>>> -    AVD_SU *su;
>>>      uint32_t su_try_inst;
>>>        TRACE_ENTER2("%s", sg->name.value);
>>>        /* Instantiate the SUs in this SG */
>>> -    for (su = sg->list_of_su, su_try_inst = 0; su != NULL; su = 
>>> su->sg_list_su_next) {
>>> +    su_try_inst = 0;
>>> +
>>> +    for (const auto& su : sg->list_of_su) {
>>>          if ((su->saAmfSUAdminState != 
>>> SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
>>>                  (su->su_on_node->saAmfNodeAdminState != 
>>> SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
>>>                  (su->saAmfSUOperState == 
>>> SA_AMF_OPERATIONAL_ENABLED) &&
>>> @@ -1174,7 +1178,7 @@
>>>                                      __FUNCTION__, su->name.value,
>>> su->su_on_node->node_info.nodeId);
>>>                          } else {
>>> -                            su_try_inst ++;
>>> +                            su_try_inst++;
>>>                          }
>>>                      }
>>>                  }
>>> @@ -1214,7 +1218,6 @@
>>>  {
>>>      AVD_SG *sg;
>>>      SaAmfAdminStateT adm_state;
>>> -    AVD_SU *su;
>>>      AVD_AVND *node;
>>>        TRACE_ENTER2("'%s', %llu", object_name->value, op_id);
>>> @@ -1233,7 +1236,7 @@
>>>      }
>>>        /* Avoid multiple admin operations on other SUs belonging to 
>>> the same SG. */
>>> -    for (su = sg->list_of_su; su != NULL; su = su->sg_list_su_next) {
>>> +    for (const auto& su : sg->list_of_su) {
>>>          node = su->get_node_ptr();
>>>          if (su->pend_cbk.invocation != 0) {
>>>              report_admin_op_error(immOiHandle, invocation, 
>>> SA_AIS_ERR_TRY_AGAIN, NULL,
>>> @@ -1285,7 +1288,7 @@
>>>          adm_state = sg->saAmfSGAdminState;
>>>          avd_sg_admin_state_set(sg, SA_AMF_ADMIN_UNLOCKED);
>>>          if (avd_cb->init_state == AVD_INIT_DONE) {
>>> -            for (su = sg->list_of_su; su != NULL; su = 
>>> su->sg_list_su_next) {
>>> +            for (const auto& su : sg->list_of_su) {
>>>                  if (su->is_in_service() == true) {
>>> su->set_readiness_state(SA_AMF_READINESS_IN_SERVICE);
>>>                  }
>>> @@ -1318,7 +1321,7 @@
>>>          avd_sg_admin_state_set(sg, SA_AMF_ADMIN_LOCKED);
>>>            if (avd_cb->init_state == AVD_INIT_DONE) {
>>> -            for (su = sg->list_of_su; su != NULL; su = 
>>> su->sg_list_su_next) {
>>> +            for (const auto& su : sg->list_of_su) {
>>> su->set_readiness_state(SA_AMF_READINESS_OUT_OF_SERVICE);
>>>              }
>>>              break;
>>> @@ -1398,7 +1401,7 @@
>>>          /* If any su is in terminating state, that means lock-in op
>>>             has not completed. Allow su to move into permanent state
>>>             i.e. either in uninstanted or term failed state. */
>>> -        for (su = sg->list_of_su; su != NULL; su = 
>>> su->sg_list_su_next) {
>>> +        for (const auto& su : sg->list_of_su) {
>>>              if (su->saAmfSUPresenceState == 
>>> SA_AMF_PRESENCE_TERMINATING) {
>>>                  report_admin_op_error(immOiHandle, invocation,
>>>                          SA_AIS_ERR_TRY_AGAIN, NULL,
>>> @@ -1410,7 +1413,7 @@
>>>            avd_sg_admin_state_set(sg, SA_AMF_ADMIN_LOCKED);
>>>  -        if ((sg->list_of_su != NULL) && 
>>> (sg->list_of_su->saAmfSUPreInstantiable == false)) {
>>> +        if ((sg->list_of_su.empty() == false) && 
>>> (sg->first_su()->saAmfSUPreInstantiable == false)) {
>>>              avd_saImmOiAdminOperationResult(immOiHandle, 
>>> invocation, SA_AIS_OK);
>>>              goto done;
>>>          }
>>> @@ -1564,30 +1567,20 @@
>>>    void avd_sg_remove_su(AVD_SU* su)
>>>  {
>>> -    AVD_SU *i_su = NULL;
>>> -    AVD_SU *prev_su = NULL;
>>>      AVD_SG *sg = su->sg_of_su;
>>>        if (su->sg_of_su != NULL) {
>>>          /* remove SU from SG */
>>> -        i_su = su->sg_of_su->list_of_su;
>>> -
>>> -        while ((i_su != NULL) && (i_su != su)) {
>>> -            prev_su = i_su;
>>> -            i_su = i_su->sg_list_su_next;
>>> +        auto su_to_delete = std::find(sg->list_of_su.begin(),
>>> +            sg->list_of_su.end(),
>>> +            su);
>>> +
>>> +        if (su_to_delete != sg->list_of_su.end()) {
>>> +            sg->list_of_su.erase(su_to_delete);
>>> +        } else {
>>> +            LOG_ER("su cannot be found");
>>>          }
>>>  -        if (i_su != su) {
>>> -            /* Log a fatal error */
>>> -        } else {
>>> -            if (prev_su == NULL) {
>>> -                su->sg_of_su->list_of_su = su->sg_list_su_next;
>>> -            } else {
>>> -                prev_su->sg_list_su_next = su->sg_list_su_next;
>>> -            }
>>> -        }
>>> -
>>> -        su->sg_list_su_next = NULL;
>>>          su->sg_of_su = NULL;
>>>      } /* if (su->sg_of_su != AVD_SG_NULL) */
>>>  @@ -1597,26 +1590,17 @@
>>>    void avd_sg_add_su(AVD_SU* su)
>>>  {
>>> -    AVD_SU *i_su = NULL;
>>> -    AVD_SU *prev_su = NULL;
>>> -
>>>      if ((su == NULL) || (su->sg_of_su == NULL))
>>>          return;
>>>  -    i_su = su->sg_of_su->list_of_su;
>>> +    su->sg_of_su->list_of_su.push_back(su);
>>>  -    while ((i_su != NULL) && (i_su->saAmfSURank < su->saAmfSURank)) {
>>> -        prev_su = i_su;
>>> -        i_su = i_su->sg_list_su_next;
>>> -    }
>>> +    // in descending order of SU rank (lowest to
>>> +    // highest integer). Note: the lower the integer
>>> +    // value, the higher the rank.
>>> +    std::sort(su->sg_of_su->list_of_su.begin(), 
>>> su->sg_of_su->list_of_su.end(),
>>> +        [](const AVD_SU *a, const AVD_SU *b) -> bool {return 
>>> a->saAmfSURank < b->saAmfSURank;});
>>>  -    if (prev_su == NULL) {
>>> -        su->sg_list_su_next = su->sg_of_su->list_of_su;
>>> -        su->sg_of_su->list_of_su = su;
>>> -    } else {
>>> -        prev_su->sg_list_su_next = su;
>>> -        su->sg_list_su_next = i_su;
>>> -    }
>>>      avd_verify_equal_ranked_su(su->sg_of_su);
>>>  }
>>>  @@ -1668,6 +1652,8 @@
>>>  }
>>>    void AVD_SG::set_fsm_state(AVD_SG_FSM_STATE state) {
>>> +    TRACE_ENTER();
>>> +
>>>      if (sg_fsm_state != state) {
>>>          TRACE("%s sg_fsm_state %u => %u", name.value, sg_fsm_state, 
>>> state);
>>>          sg_fsm_state = state;
>>> @@ -1689,6 +1675,8 @@
>>>              }
>>>          }
>>>      }
>>> +
>>> +    TRACE_LEAVE();
>>>  }
>>>    void AVD_SG::set_adjust_state(SaAdjustState state) {
>>> @@ -1712,8 +1700,9 @@
>>>  }
>>>    void AVD_SG::for_all_su_set_readiness_state(SaAmfReadinessStateT 
>>> state) {
>>> -    for (AVD_SU *su = list_of_su; su != NULL; su = 
>>> su->sg_list_su_next)
>>> +    for (const auto& su : list_of_su) {
>>>          su->set_readiness_state(state);
>>> +    }
>>>  }
>>>    bool AVD_SG::in_su_oper_list(const AVD_SU *i_su) {
>>> @@ -1753,20 +1742,24 @@
>>>   */
>>>  static void avd_verify_equal_ranked_su(AVD_SG *avd_sg)
>>>  {
>>> -    AVD_SU *pre_temp_su = NULL, *temp_su;
>>> +    uint32_t rank = 0;
>>> +    bool valid_rank = false;
>>>        TRACE_ENTER();
>>> -    /* Check ranks are still equal or not. Mark true in the begining*/
>>> +    /* Check ranks are still equal or not. Mark true in the 
>>> beginning*/
>>>      avd_sg->equal_ranked_su = true;
>>> -    temp_su = avd_sg->list_of_su;
>>> -    while(temp_su) {
>>> -        if (pre_temp_su && temp_su->saAmfSURank != 
>>> pre_temp_su->saAmfSURank) {
>>> +
>>> +    for (const auto& su : avd_sg->list_of_su) {
>>> +        if (valid_rank && rank != su->saAmfSURank) {
>>>              avd_sg->equal_ranked_su = false;
>>>              break;
>>>          }
>>> -        pre_temp_su = temp_su;
>>> -        temp_su = temp_su->sg_list_su_next;
>>> +
>>> +        // store rank for comparison
>>> +        rank = su->saAmfSURank;
>>> +        valid_rank = true;
>>>      }
>>> +
>>>      TRACE_LEAVE2("avd_sg->equal_ranked_su '%u'", 
>>> avd_sg->equal_ranked_su);
>>>        return;
>>> @@ -1782,7 +1775,7 @@
>>>  void avd_sg_adjust_config(AVD_SG *sg)
>>>  {
>>>      // SUs in an SG are equal, only need to look at the first one
>>> -    if ((sg->list_of_su != NULL) && 
>>> !sg->list_of_su->saAmfSUPreInstantiable) {
>>> +    if (sg->list_of_su.empty() == false && 
>>> !(sg->first_su()->saAmfSUPreInstantiable)) {
>>>          // NPI SUs can only be assigned one SI, see 3.2.1.1
>>>          if ((sg->saAmfSGMaxActiveSIsperSU != 
>>> static_cast<SaUint32T>(-1)) && (sg->saAmfSGMaxActiveSIsperSU > 1)) {
>>>              LOG_WA("invalid saAmfSGMaxActiveSIsperSU (%u) for NPI 
>>> SU '%s', adjusting...",
>>> @@ -1796,12 +1789,11 @@
>>>          }
>>>          sg->saAmfSGMaxStandbySIsperSU = 1;
>>>          /* saAmfSUFailover must be true for a NPI SU sec 3.11.1.3.2 
>>> AMF-B.04.01 spec */
>>> -        for (AVD_SU *su = sg->list_of_su; su != NULL; su = 
>>> su->sg_list_su_next) {
>>> +        for (const auto& su : sg->list_of_su) {
>>>              if (!su->saAmfSUFailover) {
>>>                  su->set_su_failover(true);
>>>              }
>>>          }
>>> -
>>>      }
>>>        /* adjust saAmfSGNumPrefAssignedSUs if not configured, only 
>>> applicable for
>>> @@ -1825,11 +1817,10 @@
>>>   */
>>>  uint32_t sg_instantiated_su_count(const AVD_SG *sg)
>>>  {
>>> -    uint32_t inst_su_count;
>>> -    AVD_SU *su;
>>> +    uint32_t inst_su_count = 0;
>>>        TRACE_ENTER();
>>> -    for (su = sg->list_of_su, inst_su_count = 0; su != NULL; su = 
>>> su->sg_list_su_next) {
>>> +    for (const auto& su : sg->list_of_su) {
>>>          TRACE_1("su'%s', pres state'%u', in_serv'%u', PrefIn'%u'", 
>>> su->name.value,
>>>                  su->saAmfSUPresenceState, 
>>> su->saAmfSuReadinessState, sg->saAmfSGNumPrefInserviceSUs);
>>>          if (((su->saAmfSUPresenceState == 
>>> SA_AMF_PRESENCE_INSTANTIATED) ||
>>> @@ -1838,6 +1829,7 @@
>>>              inst_su_count ++;
>>>          }
>>>      }
>>> +
>>>      TRACE_LEAVE2("%u", inst_su_count);
>>>      return inst_su_count;
>>>  }
>>> @@ -1868,7 +1860,7 @@
>>>        switch (sg->adminOp) {
>>>      case SA_AMF_ADMIN_LOCK_INSTANTIATION :
>>> -        for (AVD_SU *su = sg->list_of_su; su; su = 
>>> su->sg_list_su_next) {
>>> +        for (const auto& su : sg->list_of_su) {
>>>              if ((su->saAmfSUPresenceState != 
>>> SA_AMF_PRESENCE_UNINSTANTIATED) &&
>>>                  (su->saAmfSUPresenceState != 
>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED) &&
>>>                  (su->saAmfSUPresenceState != 
>>> SA_AMF_PRESENCE_TERMINATION_FAILED))
>>> @@ -1877,10 +1869,10 @@
>>>          break;
>>>      case SA_AMF_ADMIN_UNLOCK_INSTANTIATION :
>>>          /* Unlock-in of SG will not instantiate any component in 
>>> NPI SU.*/
>>> -        if ((sg->list_of_su != NULL) && 
>>> (sg->list_of_su->saAmfSUPreInstantiable == false))
>>> +        if ((sg->list_of_su.empty() == false) && 
>>> (sg->first_su()->saAmfSUPreInstantiable == false))
>>>              return true;
>>> -
>>> -        for (AVD_SU *su = sg->list_of_su; su; su = 
>>> su->sg_list_su_next) {
>>> +
>>> +        for (const auto& su : sg->list_of_su) {
>>>              node_admin_state = su->su_on_node->saAmfNodeAdminState;
>>>
>>>              if ((su->saAmfSUPresenceState == 
>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED) ||
>>> @@ -1935,7 +1927,7 @@
>>>   */
>>>  bool AVD_SG::is_sg_assigned_only_in_ng(const AVD_AMF_NG *ng)
>>>  {
>>> -    for (AVD_SU *su = list_of_su; su; su = su->sg_list_su_next) {
>>> +    for (const auto& su : list_of_su) {
>>>          if (su->list_of_susi == NULL)
>>>              continue;
>>>          //Return if this assigned su is not in this ng.
>>> @@ -1952,7 +1944,7 @@
>>>   */
>>>  bool AVD_SG::is_sg_serviceable_outside_ng(const AVD_AMF_NG *ng)
>>>  {
>>> -    for (AVD_SU *su = list_of_su; su; su = su->sg_list_su_next) {
>>> +    for (const auto& su : list_of_su) {
>>>          //Check if any su exists outside nodegroup for this sg.
>>>          if 
>>> (node_in_nodegroup(Amf::to_string(&su->su_on_node->name), ng) == 
>>> false) {
>>>              /*
>>> @@ -2005,3 +1997,12 @@
>>>      return rc;
>>>    }
>>> +
>>> +AVD_SU* AVD_SG::first_su()
>>> +{
>>> +    if (!list_of_su.empty()) {
>>> +        return *list_of_su.begin();
>>> +    } else {
>>> +        return NULL;
>>> +    }
>>> +}
>
>



------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to