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