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?

> +             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
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to