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