Ack.

Thanks,
Praveen

On 18-Dec-15 3:29 PM, Hans Nordeback wrote:
>   osaf/services/saf/amf/amfd/include/si.h         |    6 +-
>   osaf/services/saf/amf/amfd/include/sirankedsu.h |   19 ++-
>   osaf/services/saf/amf/amfd/sg_nway_fsm.cc       |  132 
> ++++++++++-------------
>   osaf/services/saf/amf/amfd/si.cc                |   83 +++++++-------
>   osaf/services/saf/amf/amfd/sirankedsu.cc        |    2 +-
>   5 files changed, 117 insertions(+), 125 deletions(-)
>
>
> diff --git a/osaf/services/saf/amf/amfd/include/si.h 
> b/osaf/services/saf/amf/amfd/include/si.h
> --- a/osaf/services/saf/amf/amfd/include/si.h
> +++ b/osaf/services/saf/amf/amfd/include/si.h
> @@ -45,6 +45,7 @@
>   #include <sirankedsu.h>
>   #include <amf_defs.h>
>   #include <ckpt_msg.h>
> +#include <algorithm>
>   #include <vector>
>   #include <list>
>
> @@ -102,7 +103,7 @@ public:
>       AVD_APP *app;
>       AVD_SI *si_list_app_next;
>       struct avd_sus_per_si_rank_tag *list_of_sus_per_si_rank;
> -     avd_sirankedsu_t *rankedsu_list_head;
> +     std::vector<AVD_SIRANKEDSU*> rankedsu_list;
>       SaInvocationT invocation;
>       
>       bool alarm_sent; /* SI unassigned alarm has been sent */
> @@ -120,7 +121,7 @@ public:
>       void set_admin_state(SaAmfAdminStateT state);
>
>       void add_rankedsu(const SaNameT *suname, uint32_t saAmfRank);
> -     void remove_rankedsu(const SaNameT *suname);
> +     void remove_rankedsu(const std::string &suname);
>       
>       void set_si_switch(AVD_CL_CB *cb, const SaToggleState state);
>       
> @@ -141,6 +142,7 @@ public:
>       bool is_sirank_valid(uint32_t newSiRank) const;
>       void update_sirank(uint32_t newSiRank);
>       bool si_dep_states_check();
> +        const AVD_SIRANKEDSU *get_si_ranked_su(const std::string &su_name) 
> const;
>   private:
>       AVD_SI(const AVD_SI&);
>       AVD_SI& operator=(const AVD_SI&);
> diff --git a/osaf/services/saf/amf/amfd/include/sirankedsu.h 
> b/osaf/services/saf/amf/amfd/include/sirankedsu.h
> --- a/osaf/services/saf/amf/amfd/include/sirankedsu.h
> +++ b/osaf/services/saf/amf/amfd/include/sirankedsu.h
> @@ -16,10 +16,19 @@
>   #ifndef SIRANKEDSU_H
>   #define SIRANKEDSU_H
>
> -typedef struct avd_sirankedsu {
> -     SaNameT suname;
> -     uint32_t saAmfRank;
> -     struct avd_sirankedsu *next;
> -} avd_sirankedsu_t;
> +class AVD_SIRANKEDSU {
> + public:
> +  AVD_SIRANKEDSU(const std::string &name, uint32_t rank) : suname(name), 
> saAmfRank(rank) {}
> +  const std::string& get_suname() const {return suname;}
> +  uint32_t get_sa_amf_rank() const {return saAmfRank;}
> +
> + private:
> +  std::string suname;
> +  uint32_t saAmfRank;
> +  // disallow copy and assign.
> +  AVD_SIRANKEDSU(const AVD_SIRANKEDSU&);
> +  void operator=(const AVD_SIRANKEDSU&);
> +
> +};
>
>   #endif
> diff --git a/osaf/services/saf/amf/amfd/sg_nway_fsm.cc 
> b/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
> --- a/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
> +++ b/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
> @@ -843,25 +843,7 @@ static void avd_sg_nway_swap_si_redistr(
>       }
>       TRACE_LEAVE();
>   }
> -/**
> - * @brief Finds SiRankedSU node corresponding to the given su and si
> - *
> - * @param [in] si
> - * @param [in] su
> - * @param suname
> - *
> - * @returns pointer to avd_sirankedsu_t
> - */
> -avd_sirankedsu_t *avd_si_find_sirankedsu(AVD_SI *si, AVD_SU *su)
> -{
> -        avd_sirankedsu_t *temp_su;
> -
> -        for (temp_su = si->rankedsu_list_head; temp_su != nullptr; temp_su = 
> temp_su->next) {
> -                if (memcmp(&temp_su->suname, &su->name, sizeof(SaNameT)) == 
> 0)
> -                        break;
> -        }
> -        return temp_su;
> -}
> +
>   /**
>    * @brief check if this SU has any non ranked assignments or not
>    *
> @@ -879,13 +861,13 @@ static uint32_t su_has_any_non_ranked_as
>
>       for (susi = su->list_of_susi;susi != nullptr;susi = susi->su_next) {
>               if (susi->state == ha_state) {
> -                        if (nullptr == susi->si->rankedsu_list_head) {
> +                        if (susi->si->rankedsu_list.empty() == true) {
>                                   TRACE("No sirankedsu_assignment ");
>                                   found = true;
>                                   break;
>                           } else {
>                                   /* Check whether the susi assignment is 
> based on SIRankedSU */
> -                                if (avd_si_find_sirankedsu(susi->si, 
> susi->su) == nullptr) {
> +                                if 
> (susi->si->get_si_ranked_su(Amf::to_string(&susi->su->name)) == nullptr) {
>                                           TRACE("NON sirankedsu_assignment");
>                                           found = true;
>                                           break;
> @@ -930,7 +912,7 @@ static AVD_SI * find_the_si_to_transfer(
>                               }
>                       }
>                       /* Check whether this assignment is based on 
> SIRankedSU, if so dont consider this SI for transfer */
> -                     if (avd_si_find_sirankedsu(susi->si, susi->su) != 
> nullptr) {
> +                     if 
> (susi->si->get_si_ranked_su(Amf::to_string(&susi->su->name)) != nullptr) {
>                               continue;
>                       }
>                       if (si_to_transfer == nullptr)
> @@ -1168,58 +1150,58 @@ AVD_SU *avd_sg_nway_get_su_std_equal(AVD
>    *
>    * @returns pointer to the highest ranked SU
>    */
> -AVD_SU *avd_sg_nway_si_find_highest_sirankedsu(AVD_CL_CB *cb, AVD_SI *si, 
> AVD_SU **assigned_su)
> -{
> -     AVD_SU_SI_REL *sisu;
> -     avd_sirankedsu_t *assigned_sirankedsu = nullptr;
> -     AVD_SU *pref_sirankedsu = nullptr;
> -     AVD_SU *ranked_su;
> -     avd_sirankedsu_t *sirankedsu = nullptr;
> -
> -     TRACE_ENTER2("for SI '%s'",si->name.value);
> -
> -     /* Find the SU for which Active role is assigned for this SI */
> -     for (sisu = si->list_of_sisu; sisu ; sisu = sisu->si_next) {
> -             if (SA_AMF_HA_ACTIVE == sisu->state) {
> -                     *assigned_su = sisu->su;
> -                     break;
> -             }
> -     }
> -     /* Find the corresponding sirankedsu */
> -     if (sisu)
> -             assigned_sirankedsu = avd_si_find_sirankedsu(si, sisu->su);
> -     else {
> -             /* Atleast one Active assignment should be there */
> -             LOG_ER("Not able to find the Active assignment");
> -             goto done;
> -     }
> -     
> -     /* Iterate through the si->rankedsu_list_head to find the highest 
> sirankedsu */
> -     sirankedsu = si->rankedsu_list_head;
> -     for (; sirankedsu ; sirankedsu = sirankedsu->next) {
> -             if ((ranked_su = 
> su_db->find(Amf::to_string(&sirankedsu->suname))) != nullptr) {
> -                     if (ranked_su == *assigned_su) {
> -                                TRACE("SI is assigned to highest SIRankedSU 
> for this SI");
> -                                break;
> -                     } else {
> -                             if ((ranked_su->saAmfSuReadinessState == 
> SA_AMF_READINESS_IN_SERVICE) &&
> -                                     (ranked_su->saAmfSUNumCurrActiveSIs < 
> si->sg_of_si->saAmfSGMaxActiveSIsperSU)) {
> -                                     if (assigned_sirankedsu) {
> -                                             if 
> (assigned_sirankedsu->saAmfRank > sirankedsu->saAmfRank) {
> -                                                     pref_sirankedsu = 
> ranked_su;
> -                                                     break;
> -                                             }
> -                                     } else {
> -                                             pref_sirankedsu = ranked_su;
> -                                             break;
> -                                     }
> -                             }
> -                     }
> -             }
> -     }
> +AVD_SU *avd_sg_nway_si_find_highest_sirankedsu(AVD_CL_CB *cb, AVD_SI *si, 
> AVD_SU **assigned_su) {
> +  AVD_SU_SI_REL *sisu;
> +  const AVD_SIRANKEDSU *assigned_sirankedsu = nullptr;
> +  AVD_SU *pref_sirankedsu = nullptr;
> +  AVD_SU *ranked_su;
> +  AVD_SIRANKEDSU *sirankedsu = nullptr;
> +
> +  TRACE_ENTER2("for SI '%s'", si->name.value);
> +
> +  /* Find the SU for which Active role is assigned for this SI */
> +  for (sisu = si->list_of_sisu; sisu; sisu = sisu->si_next) {
> +    if (SA_AMF_HA_ACTIVE == sisu->state) {
> +      *assigned_su = sisu->su;
> +      break;
> +    }
> +  }
> +  /* Find the corresponding sirankedsu */
> +  if (sisu)
> +    assigned_sirankedsu = 
> si->get_si_ranked_su(Amf::to_string(&sisu->su->name));
> +  else {
> +    /* Atleast one Active assignment should be there */
> +    LOG_ER("Not able to find the Active assignment");
> +    goto done;
> +  }
> +
> +  /* Iterate through the si->rankedsu_list_head to find the highest 
> sirankedsu */
> +
> +  for (auto iter = si->rankedsu_list.cbegin(); iter != 
> si->rankedsu_list.cend(); ++iter) {
> +    sirankedsu = *iter;
> +    if ((ranked_su = su_db->find(sirankedsu->get_suname())) != nullptr) {
> +      if (ranked_su == *assigned_su) {
> +        TRACE("SI is assigned to highest SIRankedSU for this SI");
> +        break;
> +      } else {
> +        if ((ranked_su->saAmfSuReadinessState == 
> SA_AMF_READINESS_IN_SERVICE) &&
> +            (ranked_su->saAmfSUNumCurrActiveSIs < 
> si->sg_of_si->saAmfSGMaxActiveSIsperSU)) {
> +          if (assigned_sirankedsu) {
> +            if (assigned_sirankedsu->get_sa_amf_rank() > 
> sirankedsu->get_sa_amf_rank()) {
> +              pref_sirankedsu = ranked_su;
> +              break;
> +            }
> +          } else {
> +            pref_sirankedsu = ranked_su;
> +            break;
> +          }
> +        }
> +      }
> +    }
> +  }
>   done:
> -     TRACE_LEAVE2(" '%s'",pref_sirankedsu ? (char 
> *)pref_sirankedsu->name.value:"assigned to highest SIRankedSU");
> -     return pref_sirankedsu;
> +  TRACE_LEAVE2(" '%s'", pref_sirankedsu ? (char *) 
> pref_sirankedsu->name.value : "assigned to highest SIRankedSU");
> +  return pref_sirankedsu;
>   }
>
>   
> /*****************************************************************************
> @@ -1267,7 +1249,7 @@ uint32_t avd_sg_nway_si_assign(AVD_CL_CB
>
>               is_all_si_ok = true;
>
> -             if (curr_si->list_of_sisu && sg->saAmfSGAutoAdjust && 
> (curr_si->rankedsu_list_head)) {
> +             if (curr_si->list_of_sisu && sg->saAmfSGAutoAdjust && 
> (!curr_si->rankedsu_list.empty())) {
>                       /* The SI has sirankedsu configured and auto adjust 
> enabled, make
>                        *sure the highest ranked SU has the active assignment
>                        */
> @@ -3564,7 +3546,7 @@ SaAisErrorT SG_NWAY::si_swap(AVD_SI *si,
>               rc = SA_AIS_ERR_BAD_OPERATION;
>               goto done;
>       }
> -     if ((si->rankedsu_list_head != nullptr) && (sg->saAmfSGAutoAdjust == 
> SA_TRUE)) {
> +     if ((!si->rankedsu_list.empty()) && (sg->saAmfSGAutoAdjust == SA_TRUE)) 
> {
>               LOG_NO("%s SIRankedSU configured and autoadjust enabled, 
> si-swap not allowed", si->name.value);
>               rc = SA_AIS_ERR_BAD_OPERATION;
>               goto done;
> diff --git a/osaf/services/saf/amf/amfd/si.cc 
> b/osaf/services/saf/amf/amfd/si.cc
> --- a/osaf/services/saf/amf/amfd/si.cc
> +++ b/osaf/services/saf/amf/amfd/si.cc
> @@ -15,7 +15,6 @@
>    *            Ericsson AB
>    *
>    */
> -
>   #include <logtrace.h>
>   #include <saflog.h>
>
> @@ -210,58 +209,39 @@ void AVD_SI::add_csi_db(AVD_CSI* csi)
>    * @param suname
>    * @param saAmfRank
>    */
> -void AVD_SI::add_rankedsu(const SaNameT *suname, uint32_t saAmfRank)
> -{
> -     avd_sirankedsu_t *tmp;
> -     avd_sirankedsu_t *prev = nullptr;
> -     avd_sirankedsu_t *ranked_su;
> -     TRACE_ENTER();
> +void AVD_SI::add_rankedsu(const SaNameT *suname, uint32_t saAmfRank) {
> +  AVD_SIRANKEDSU *ranked_su;
> +  TRACE_ENTER();
>
> -     ranked_su = new avd_sirankedsu_t;
> -     ranked_su->suname = *suname;
> -     ranked_su->saAmfRank = saAmfRank;
> +  ranked_su = new AVD_SIRANKEDSU(Amf::to_string(suname), saAmfRank);
>
> -     for (tmp = rankedsu_list_head; tmp != nullptr; tmp = tmp->next) {
> -             if (tmp->saAmfRank >= saAmfRank)
> -                     break;
> -             else
> -                     prev = tmp;
> -     }
> +  rankedsu_list.push_back(ranked_su);
>
> -     if (prev == nullptr) {
> -             ranked_su->next = rankedsu_list_head;
> -             rankedsu_list_head = ranked_su;
> -     } else {
> -             ranked_su->next = prev->next;
> -             prev->next = ranked_su;
> -     }
> -     TRACE_LEAVE();
> +  std::sort(rankedsu_list.begin(), rankedsu_list.end(), [](const 
> AVD_SIRANKEDSU *a, const AVD_SIRANKEDSU * b) -> bool {
> +    return a->get_sa_amf_rank() < b->get_sa_amf_rank();
> +  });
> +
> +  TRACE_LEAVE();
>   }
> +
>   /**
>    * @brief Remove a SIranked SU from the SI list
>    *
>    * @param si
>    * @param suname
>    */
> -void AVD_SI::remove_rankedsu(const SaNameT *suname)
> -{
> -     avd_sirankedsu_t *tmp;
> -     avd_sirankedsu_t *prev = nullptr;
> -     TRACE_ENTER();
> +void AVD_SI::remove_rankedsu(const std::string &suname) {
> +  TRACE_ENTER();
> +     
> +  auto pos = std::find_if(rankedsu_list.begin(), rankedsu_list.end(), 
> [&suname] (AVD_SIRANKEDSU *sirankedsu) -> bool {
> +    return sirankedsu->get_suname() == suname;});
>
> -     for (tmp = rankedsu_list_head; tmp != nullptr; tmp = tmp->next) {
> -             if (memcmp(&tmp->suname, suname, sizeof(*suname)) == 0)
> -                     break;
> -             prev = tmp;
> -     }
> +  if (pos != rankedsu_list.end()) {
> +    rankedsu_list.erase(pos);
> +    delete *pos;
> +  }
>
> -     if (prev == nullptr)
> -             rankedsu_list_head = nullptr;
> -     else
> -             prev->next = tmp->next;
> -
> -     delete tmp;
> -     TRACE_LEAVE();
> +  TRACE_LEAVE();
>   }
>
>   void AVD_SI::remove_csi(AVD_CSI* csi)
> @@ -316,7 +296,7 @@ AVD_SI::AVD_SI() :
>       app(nullptr),
>       si_list_app_next(nullptr),
>       list_of_sus_per_si_rank(nullptr),
> -     rankedsu_list_head(nullptr),
> +     rankedsu_list {},
>       invocation(0),
>       alarm_sent(false)
>   {
> @@ -1501,3 +1481,22 @@ void AVD_SI::update_sirank(uint32_t newS
>       saAmfSIRank = (newSiRank == 0) ? ~0U : newSiRank;
>       sg->add_si(this);
>   }
> +
> +/*
> + * @brief Get si_ranked_su
> + *
> + * @param [in] @su_name: si ranked su
> + */
> +const AVD_SIRANKEDSU *AVD_SI::get_si_ranked_su(const std::string &su_name) 
> const {
> +
> +  const AVD_SIRANKEDSU* sirankedsu = nullptr;
> +
> +  for (auto tmp : rankedsu_list) {
> +    if (tmp->get_suname() == su_name) {
> +      sirankedsu = tmp;
> +      break;
> +    }
> +  }
> +
> +  return sirankedsu;
> +}
> \ No newline at end of file
> diff --git a/osaf/services/saf/amf/amfd/sirankedsu.cc 
> b/osaf/services/saf/amf/amfd/sirankedsu.cc
> --- a/osaf/services/saf/amf/amfd/sirankedsu.cc
> +++ b/osaf/services/saf/amf/amfd/sirankedsu.cc
> @@ -228,7 +228,7 @@ static void avd_sirankedsu_del_si_list(A
>                                   
> sus_per_si_rank->sus_per_si_rank_list_si_next;
>                       }
>               }
> -             
> sus_per_si_rank->sus_per_si_rank_on_si->remove_rankedsu(&sus_per_si_rank->su_name);
> +             
> sus_per_si_rank->sus_per_si_rank_on_si->remove_rankedsu(Amf::to_string(&sus_per_si_rank->su_name));
>
>               sus_per_si_rank->sus_per_si_rank_list_si_next = nullptr;
>               sus_per_si_rank->sus_per_si_rank_on_si = nullptr;
>

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

Reply via email to