One goal of refactoring I would say is to reduce code duplication with the help 
of good interfaces. In this case it is just a matter of having two insert 
methods, one that can fail and one that cannot, let's call it "insert_unique". 
By using insert_unique asserts on the client side can be removed.

About  the comment on NCSCC_RC_SUCCESS/FAILURE I meant that we are trying to 
break out from the old legacy but in this case for not much reason use an error 
code from leap!

Thanks,
Hans

> -----Original Message-----
> From: Nagendra Kumar [mailto:[email protected]]
> Sent: den 22 april 2014 08:04
> To: Hans Feldt
> Cc: [email protected]
> Subject: Re: [devel] [PATCH 1 of 1] amfd: use db_template for the SU db [#713]
> 
> > OK fixed before push but since this will become a pattern in about 20 
> > places I
> > think it would be better to have db->insert return void and internally do 
> > this
> > check. What do you think?
> 
> If we keep the check outside, it can give flexibility to the user whether to 
> assert or not if insert fails.
> In some conditions if insert fails, function can return from there itself.
> Function() {
> 
> If (Insert(su1) == fails) {
>       Log(Duplicate SU1);
>       Return;
>       }
> Else {
> Continue
> }
> }
> 
> > As a side note, db->insert should not return NCSCC_RC_SUCCESS/FAILURE but a
> > bool
> As far as description of insert says, it fails when it adds duplicate. Are we 
> expecting other errors or did I get it wrong ?
> 
> Thanks
> -Nagu
> 
> > -----Original Message-----
> > From: Hans Feldt [mailto:[email protected]]
> > Sent: 22 April 2014 11:01
> > To: Nagendra Kumar
> > Cc: Hans Nordeback; Praveen Malviya; [email protected]
> > Subject: Re: [PATCH 1 of 1] amfd: use db_template for the SU db [#713]
> >
> > OK fixed before push but since this will become a pattern in about 20 
> > places I
> > think it would be better to have db->insert return void and internally do 
> > this
> > check. What do you think?
> >
> > As a side note, db->insert should not return NCSCC_RC_SUCCESS/FAILURE but a
> > bool.
> >
> > Thanks,
> > Hans
> >
> > On 18 April 2014 15:12, Nagendra Kumar <[email protected]> wrote:
> > > Ack with comment:
> > >
> > > We need to check for assert as done in avd_su_db_add when it fails to add.
> > When insert returns NCSCC_RC_FAILURE, we need to assert or log error at all
> > the places.
> > >
> > > -               avd_su_db_add(su);
> > > +               su_db->insert(su);
> > >
> > > Thanks
> > > -Nagu
> > >
> > >> -----Original Message-----
> > >> From: Hans Feldt [mailto:[email protected]]
> > >> Sent: 17 April 2014 15:45
> > >> To: [email protected]; Praveen Malviya; Nagendra Kumar
> > >> Cc: [email protected]
> > >> Subject: [PATCH 1 of 1] amfd: use db_template for the SU db [#713]
> > >>
> > >>  osaf/services/saf/amf/amfd/ckpt_dec.cc    |   20 +-
> > >>  osaf/services/saf/amf/amfd/ckpt_enc.cc    |   13 +-
> > >>  osaf/services/saf/amf/amfd/ckpt_updt.cc   |   12 +-
> > >>  osaf/services/saf/amf/amfd/comp.cc        |    2 +-
> > >>  osaf/services/saf/amf/amfd/imm.cc         |    8 +-
> > >>  osaf/services/saf/amf/amfd/include/su.h   |   36 +------
> > >>  osaf/services/saf/amf/amfd/include/susi.h |    1 -
> > >>  osaf/services/saf/amf/amfd/ndproc.cc      |    2 +-
> > >>  osaf/services/saf/amf/amfd/sg_nway_fsm.cc |    2 +-
> > >>  osaf/services/saf/amf/amfd/sgproc.cc      |    6 +-
> > >>  osaf/services/saf/amf/amfd/siass.cc       |   78 +--------------
> > >>  osaf/services/saf/amf/amfd/sirankedsu.cc  |    2 +-
> > >>  osaf/services/saf/amf/amfd/su.cc          |   78 +++-----------
> > >>  osaf/services/saf/amf/amfd/util.cc        |  157 
> > >> +++++++----------------------
> > >>  14 files changed, 96 insertions(+), 321 deletions(-)
> > >>
> > >>
> > >> diff --git a/osaf/services/saf/amf/amfd/ckpt_dec.cc
> > >> b/osaf/services/saf/amf/amfd/ckpt_dec.cc
> > >> --- a/osaf/services/saf/amf/amfd/ckpt_dec.cc
> > >> +++ b/osaf/services/saf/amf/amfd/ckpt_dec.cc
> > >> @@ -1452,7 +1452,7 @@ static uint32_t dec_su_preinstan(AVD_CL_
> > >>
> > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > >>
> > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > >>               osafassert(0);
> > >>
> > >>       /* Update the fields received in this checkpoint message */ @@
> > >> -1544,7 +1544,7 @@ static uint32_t dec_su_admin_state(AVD_C
> > >>
> > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > >>
> > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > >>               osafassert(0);
> > >>
> > >>       /* Update the fields received in this checkpoint message */ @@
> > >> -1590,7 +1590,7 @@ static uint32_t dec_su_readiness_state(A
> > >>
> > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > >>
> > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > >>               osafassert(0);
> > >>
> > >>       /* Update the fields received in this checkpoint message */ @@
> > >> -1636,7 +1636,7 @@ static uint32_t dec_su_pres_state(AVD_CL
> > >>
> > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > >>
> > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > >>               osafassert(0);
> > >>
> > >>       /* Update the fields received in this checkpoint message */ @@
> > >> -1682,7 +1682,7 @@ static uint32_t dec_su_si_curr_active(AV
> > >>
> > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > >>
> > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > >>               osafassert(0);
> > >>
> > >>       /* Update the fields received in this checkpoint message */ @@
> > >> -1727,7 +1727,7 @@ static uint32_t dec_su_si_curr_stby(AVD_
> > >>
> > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > >>
> > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > >>               osafassert(0);
> > >>
> > >>       /* Update the fields received in this checkpoint message */ @@
> > >> -1773,7 +1773,7 @@ static uint32_t dec_su_term_state(AVD_CL
> > >>
> > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > >>
> > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > >>               osafassert(0);
> > >>
> > >>       /* Update the fields received in this checkpoint message */ @@
> > >> -1818,7 +1818,7 @@ static uint32_t dec_su_switch(AVD_CL_CB
> > >>
> > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > >>
> > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > >>               osafassert(0);
> > >>
> > >>       /* Update the fields received in this checkpoint message */ @@
> > >> -1864,7 +1864,7 @@ static uint32_t dec_su_act_state(AVD_CL_
> > >>
> > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > >>
> > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > >>               osafassert(0);
> > >>
> > >>       /* Update the fields received in this checkpoint message */ @@
> > >> -1910,7 +1910,7 @@ static uint32_t dec_su_restart_count(AVD
> > >>
> > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > >>
> > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > >>               osafassert(0);
> > >>
> > >>       /* Update the fields received in this checkpoint message */
> > >> diff --git a/osaf/services/saf/amf/amfd/ckpt_enc.cc
> > >> b/osaf/services/saf/amf/amfd/ckpt_enc.cc
> > >> --- a/osaf/services/saf/amf/amfd/ckpt_enc.cc
> > >> +++ b/osaf/services/saf/amf/amfd/ckpt_enc.cc
> > >> @@ -2334,8 +2334,9 @@ static uint32_t enc_cs_su_config(AVD_CL_
> > >>       /*
> > >>        * Walk through the entire list and send the entire list data.
> > >>        */
> > >> -     for (su = avd_su_getnext(&su_name); su != NULL;
> > >> -          su = avd_su_getnext(&su_name)) {
> > >> +     for (std::map<std::string, AVD_SU*>::const_iterator it = su_db-
> > >> >begin();
> > >> +                     it != su_db->end(); it++) {
> > >> +             su = it->second;
> > >>               status = m_NCS_EDU_VER_EXEC(&cb->edu_hdl,
> > >> avsv_edp_ckpt_msg_su, &enc->io_uba,
> > >>                                           EDP_OP_TYPE_ENC, su,
> > >> &ederror,
> > >> enc->i_peer_version);
> > >>
> > >> @@ -2546,7 +2547,6 @@ static uint32_t enc_cs_siass(AVD_CL_CB *  {
> > >>       uint32_t status = NCSCC_RC_SUCCESS;
> > >>       AVD_SU *su;
> > >> -     SaNameT su_name = {0};
> > >>       AVSV_SU_SI_REL_CKPT_MSG su_si_ckpt;
> > >>       AVD_SU_SI_REL *rel;
> > >>       EDU_ERR ederror = static_cast<EDU_ERR>(0); @@ -2558,10 +2558,10
> > >> @@ static uint32_t enc_cs_siass(AVD_CL_CB *
> > >>        * are sent.We will send the corresponding COMP_CSI
> > >> relationship for that SU_SI
> > >>        * in the same update.
> > >>        */
> > >> -     su_name.length = 0;
> > >>       memset(&su_si_ckpt, 0, sizeof(su_si_ckpt));
> > >> -     for (su = avd_su_getnext(&su_name); su != NULL;
> > >> -          su = avd_su_getnext(&su_name)) {
> > >> +     for (std::map<std::string, AVD_SU*>::const_iterator it = su_db-
> > >> >begin();
> > >> +                     it != su_db->end(); it++) {
> > >> +             su = it->second;
> > >>               su_si_ckpt.su_name = su->name;
> > >>
> > >>               for (rel = su->list_of_susi; rel != NULL; rel =
> > >> rel->su_next) { @@ -2580,7 +2580,6 @@ static uint32_t
> > >> enc_cs_siass(AVD_CL_CB *
> > >>
> > >>                       (*num_of_obj)++;
> > >>               }
> > >> -             su_name = su->name;
> > >>       }
> > >>       TRACE_LEAVE2("status '%u'", status);
> > >>       return status;
> > >> diff --git a/osaf/services/saf/amf/amfd/ckpt_updt.cc
> > >> b/osaf/services/saf/amf/amfd/ckpt_updt.cc
> > >> --- a/osaf/services/saf/amf/amfd/ckpt_updt.cc
> > >> +++ b/osaf/services/saf/amf/amfd/ckpt_updt.cc
> > >> @@ -184,8 +184,8 @@ uint32_t avd_ckpt_su(AVD_CL_CB *cb, AVD_
> > >>
> > >>       osafassert (action == NCS_MBCSV_ACT_UPDATE);
> > >>
> > >> -     if (NULL == (su = avd_su_get(&ckpt_su->name))) {
> > >> -             LOG_ER("avd_su_get FAILED for '%s'", ckpt_su->name.value);
> > >> +     if (NULL == (su = su_db->find(&ckpt_su->name))) {
> > >> +             LOG_ER("su_db->find FAILED for '%s'",
> > >> + ckpt_su->name.value);
> > >>               rc = NCSCC_RC_FAILURE;
> > >>               goto done;
> > >>       }
> > >> @@ -272,7 +272,7 @@ uint32_t avd_ckpt_su_oper_list(AVD_CL_CB
> > >>
> > >>       TRACE_ENTER2("'%s'", ckpt_su->name.value);
> > >>
> > >> -     su = avd_su_get(&ckpt_su->name);
> > >> +     su = su_db->find(&ckpt_su->name);
> > >>       osafassert(su);
> > >>
> > >>       if (NCS_MBCSV_ACT_ADD == action) @@ -359,8 +359,8 @@ uint32_t
> > >> avd_ckpt_si_trans(AVD_CL_CB *cb
> > >>       switch (action) {
> > >>       case NCS_MBCSV_ACT_ADD:
> > >>               sg_ptr->si_tobe_redistributed =
> > >> avd_si_get(&si_trans_ckpt-
> > >> >si_name);
> > >> -             sg_ptr->min_assigned_su = avd_su_get(&si_trans_ckpt-
> > >> >min_su_name);
> > >> -             sg_ptr->max_assigned_su = avd_su_get(&si_trans_ckpt-
> > >> >max_su_name);
> > >> +             sg_ptr->min_assigned_su = su_db->find(&si_trans_ckpt-
> > >> >min_su_name);
> > >> +             sg_ptr->max_assigned_su = su_db->find(&si_trans_ckpt-
> > >> >max_su_name);
> > >>               break;
> > >>
> > >>       case NCS_MBCSV_ACT_RMV:
> > >> @@ -408,7 +408,7 @@ uint32_t avd_ckpt_siass(AVD_CL_CB *cb, A
> > >>
> > >>       su_si_rel_ptr = avd_susi_find(cb, &su_si_ckpt->su_name,
> > >> &su_si_ckpt-
> > >> >si_name);
> > >>
> > >> -     su_ptr = avd_su_get(&su_si_ckpt->su_name);
> > >> +     su_ptr = su_db->find(&su_si_ckpt->su_name);
> > >>       osafassert(su_ptr);
> > >>       si_ptr_up = avd_si_get(&su_si_ckpt->si_name);
> > >>       osafassert(si_ptr_up);
> > >> diff --git a/osaf/services/saf/amf/amfd/comp.cc
> > >> b/osaf/services/saf/amf/amfd/comp.cc
> > >> --- a/osaf/services/saf/amf/amfd/comp.cc
> > >> +++ b/osaf/services/saf/amf/amfd/comp.cc
> > >> @@ -213,7 +213,7 @@ static void comp_add_to_model(AVD_COMP *
> > >>       }
> > >>
> > >>       avsv_sanamet_init(&comp->comp_info.name, &dn, "safSu");
> > >> -     su = comp->su = avd_su_get(&dn);
> > >> +     su = comp->su = su_db->find(&dn);
> > >>
> > >>       avd_comp_db_add(comp);
> > >>       comp->comp_type = avd_comptype_get(&comp->saAmfCompType);
> > >> diff --git a/osaf/services/saf/amf/amfd/imm.cc
> > >> b/osaf/services/saf/amf/amfd/imm.cc
> > >> --- a/osaf/services/saf/amf/amfd/imm.cc
> > >> +++ b/osaf/services/saf/amf/amfd/imm.cc
> > >> @@ -1553,8 +1553,6 @@ void avd_saImmOiRtObjectDelete(const SaN
> > >>   */
> > >>  void avd_imm_update_runtime_attrs(void)
> > >>  {
> > >> -     SaNameT su_name = {0};
> > >> -     AVD_SU  *su;
> > >>       SaNameT comp_name ={0};
> > >>       AVD_COMP *comp;
> > >>       SaNameT node_name = {0};
> > >> @@ -1563,8 +1561,9 @@ void avd_imm_update_runtime_attrs(void)
> > >>       AVD_SI  *si;
> > >>
> > >>       /* Update SU Class runtime cached attributes. */
> > >> -     su = avd_su_getnext(&su_name);
> > >> -     while (su != NULL) {
> > >> +     for (std::map<std::string, AVD_SU*>::const_iterator it = su_db-
> > >> >begin();
> > >> +                     it != su_db->end(); it++) {
> > >> +             AVD_SU *su = it->second;
> > >>               avd_saImmOiRtObjectUpdate(&su->name,
> > >> "saAmfSUPreInstantiable",
> > >>                       SA_IMM_ATTR_SAUINT32T,  &su-
> > >> >saAmfSUPreInstantiable);
> > >>
> > >> @@ -1580,7 +1579,6 @@ void avd_imm_update_runtime_attrs(void)
> > >>               avd_saImmOiRtObjectUpdate(&su->name,
> > >> "saAmfSUReadinessState",
> > >>                       SA_IMM_ATTR_SAUINT32T, &su-
> > >> >saAmfSuReadinessState);
> > >>
> > >> -             su = avd_su_getnext(&su->name);
> > >>       }
> > >>
> > >>       /* Update Component Class runtime cached attributes. */ diff
> > >> --git a/osaf/services/saf/amf/amfd/include/su.h
> > >> b/osaf/services/saf/amf/amfd/include/su.h
> > >> --- a/osaf/services/saf/amf/amfd/include/su.h
> > >> +++ b/osaf/services/saf/amf/amfd/include/su.h
> > >> @@ -35,7 +35,6 @@
> > >>  #define AVD_SU_H
> > >>
> > >>  #include <saAmf.h>
> > >> -#include <ncspatricia.h>
> > >>  #include <def.h>
> > >>  #include <cb.h>
> > >>  #include <node.h>
> > >> @@ -43,6 +42,7 @@
> > >>  #include <amf_defs.h>
> > >>  #include <msg.h>
> > >>  #include <comp.h>
> > >> +#include "include/db_template.h"
> > >>
> > >>  /* The semantics the SU is undergoing. */  typedef enum { @@ -57,8
> > >> +57,6 @@ typedef enum {
> > >>   */
> > >>  class AVD_SU {
> > >>   public:
> > >> -     NCS_PATRICIA_NODE tree_node;    /* key will be the SU name */
> > >> -
> > >>       SaNameT name;
> > >>       SaNameT saAmfSUType;
> > >>       uint32_t saAmfSURank;
> > >> @@ -120,6 +118,8 @@ class AVD_SU {
> > >>       void set_all_susis_assigned(void);  };
> > >>
> > >> +extern AmfDb<AVD_SU> *su_db;
> > >> +
> > >>  typedef struct {
> > >>       NCS_PATRICIA_NODE tree_node;    /* key is name */
> > >>       SaNameT name;
> > >> @@ -166,36 +166,6 @@ extern AVD_SU *avd_su_new(const SaNameT
> > >>   */
> > >>  extern void avd_su_delete(AVD_SU *su);
> > >>
> > >> -/**
> > >> - * Add SU to SU DB.
> > >> - * @param su
> > >> - */
> > >> -extern void avd_su_db_add(AVD_SU *su);
> > >> -
> > >> -/**
> > >> - * Remove SU from SU DB
> > >> - * @param su
> > >> - */
> > >> -extern void avd_su_db_remove(AVD_SU *su);
> > >> -
> > >> -/**
> > >> - * Get SU object from DB using given key
> > >> - *
> > >> - * @param dn
> > >> - *
> > >> - * @return struct AVD_SU*
> > >> - */
> > >> -extern AVD_SU *avd_su_get(const SaNameT *dn);
> > >> -
> > >> -/**
> > >> - * Get next SU object from DB using given key
> > >> - *
> > >> - * @param dn
> > >> - *
> > >> - * @return struct AVD_SU*
> > >> - */
> > >> -extern AVD_SU *avd_su_getnext(const SaNameT *dn);
> > >> -
> > >>  extern void avd_su_remove_comp(struct avd_comp_tag *comp);  extern
> > >> void avd_su_add_comp(struct avd_comp_tag *comp);
> > >>
> > >> diff --git a/osaf/services/saf/amf/amfd/include/susi.h
> > >> b/osaf/services/saf/amf/amfd/include/susi.h
> > >> --- a/osaf/services/saf/amf/amfd/include/susi.h
> > >> +++ b/osaf/services/saf/amf/amfd/include/susi.h
> > >> @@ -142,7 +142,6 @@ AVD_SU_SI_REL *avd_susi_find(AVD_CL_CB *
> > extern
> > >> void avd_susi_update(AVD_SU_SI_REL *susi, SaAmfHAStateT ha_state);
> > >>
> > >>  AVD_SU_SI_REL *avd_su_susi_find(AVD_CL_CB *cb, AVD_SU *su, const
> > >> SaNameT *si_name); -AVD_SU_SI_REL *avd_susi_find_next(AVD_CL_CB
> > *cb,
> > >> SaNameT su_name, SaNameT si_name);  uint32_t
> > >> avd_susi_delete(AVD_CL_CB *cb, AVD_SU_SI_REL *susi, bool ckpt);
> > >> extern AVD_SUS_PER_SI_RANK *avd_sirankedsu_getnext_valid(AVD_CL_CB
> > >> *cb,
> > >>       AVD_SUS_PER_SI_RANK_INDX indx, AVD_SU **o_su); diff --git
> > >> a/osaf/services/saf/amf/amfd/ndproc.cc
> > >> b/osaf/services/saf/amf/amfd/ndproc.cc
> > >> --- a/osaf/services/saf/amf/amfd/ndproc.cc
> > >> +++ b/osaf/services/saf/amf/amfd/ndproc.cc
> > >> @@ -715,7 +715,7 @@ void avd_data_update_req_evh(AVD_CL_CB *
> > >>               }
> > >>       case AVSV_SA_AMF_SU:{
> > >>                       /* Find the component record in the database,
> > >> specified in the message. */
> > >> -                     if ((su = avd_su_get(&n2d_msg-
> > >> >msg_info.n2d_data_req.param_info.name)) == NULL) {
> > >> +                     if ((su = su_db->find(&n2d_msg-
> > >> >msg_info.n2d_data_req.param_info.name)) == NULL) {
> > >>                               LOG_ER("%s: Invalid SU '%s' (%u)",
> > >> __FUNCTION__,
> > >>                                       n2d_msg-
> > >> >msg_info.n2d_data_req.param_info.name.value,
> > >>                                       n2d_msg-
> > >> >msg_info.n2d_data_req.param_info.name.length);
> > >> 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
> > >> @@ -1389,7 +1389,7 @@ AVD_SU *avd_sg_nway_si_find_highest_sira
> > >>       /* 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 = avd_su_get(&sirankedsu->suname)) != NULL) 
> > >> {
> > >> +             if ((ranked_su = su_db->find(&sirankedsu->suname)) !=
> > >> + NULL)
> > >> {
> > >>                       if (ranked_su == *assigned_su) {
> > >>                                  TRACE("SI is assigned to highest 
> > >> SIRankedSU for this SI");
> > >>                                  break; diff --git
> > >> a/osaf/services/saf/amf/amfd/sgproc.cc
> > >> b/osaf/services/saf/amf/amfd/sgproc.cc
> > >> --- a/osaf/services/saf/amf/amfd/sgproc.cc
> > >> +++ b/osaf/services/saf/amf/amfd/sgproc.cc
> > >> @@ -429,7 +429,7 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
> > >>
> > >>       /* get the SU from the tree */
> > >>
> > >> -     if ((su = avd_su_get(&n2d_msg->msg_info.n2d_opr_state.su_name))
> > >> == NULL) {
> > >> +     if ((su =
> > >> + su_db->find(&n2d_msg->msg_info.n2d_opr_state.su_name))
> > >> == NULL) {
> > >>               LOG_ER("%s: %s not found", __FUNCTION__, n2d_msg-
> > >> >msg_info.n2d_opr_state.su_name.value);
> > >>               goto done;
> > >>       }
> > >> @@ -794,7 +794,7 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
> > >>                * SU operation.
> > >>                */
> > >>
> > >> -             if ((su = avd_su_get(&n2d_msg-
> > >> >msg_info.n2d_su_si_assign.su_name)) == NULL) {
> > >> +             if ((su = su_db->find(&n2d_msg-
> > >> >msg_info.n2d_su_si_assign.su_name)) == NULL) {
> > >>                       LOG_ER("%s:%d %s", __FUNCTION__, __LINE__,
> > >> n2d_msg->msg_info.n2d_su_si_assign.su_name.value);
> > >>                       goto done;
> > >>               }
> > >> @@ -1108,7 +1108,7 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
> > >>          SI could be assigned to SU successfully if there was any.
> > >> The operation failed if
> > >>          AvND encountered error while assigning/unassigning SI to the
> > >> SU. */
> > >>
> > >> -     su = avd_su_get(&n2d_msg->msg_info.n2d_su_si_assign.su_name);
> > >> +     su = su_db->find(&n2d_msg->msg_info.n2d_su_si_assign.su_name);
> > >>
> > >>       if (su != NULL) {
> > >>               if (su->pend_cbk.invocation != 0) { diff --git
> > >> a/osaf/services/saf/amf/amfd/siass.cc
> > >> b/osaf/services/saf/amf/amfd/siass.cc
> > >> --- a/osaf/services/saf/amf/amfd/siass.cc
> > >> +++ b/osaf/services/saf/amf/amfd/siass.cc
> > >> @@ -178,7 +178,7 @@ AVD_SU_SI_REL *avd_susi_create(AVD_CL_CB
> > >>       for (su_rank_rec = avd_sirankedsu_getnext(cb, i_idx);
> > >>            su_rank_rec && (m_CMP_HORDER_SANAMET(su_rank_rec-
> > >> >indx.si_name, si->name) == 0);
> > >>            su_rank_rec = avd_sirankedsu_getnext(cb, su_rank_rec->indx)) {
> > >> -             curr_su = avd_su_get(&su_rank_rec->su_name);
> > >> +             curr_su = su_db->find(&su_rank_rec->su_name);
> > >>               if (curr_su == su)
> > >>                       break;
> > >>       }
> > >> @@ -201,7 +201,7 @@ AVD_SU_SI_REL *avd_susi_create(AVD_CL_CB
> > >>                            i_su_rank_rec
> > >>                            && (m_CMP_HORDER_SANAMET(i_su_rank_rec-
> > >> >indx.si_name, si->name) == 0);
> > >>                            i_su_rank_rec = avd_sirankedsu_getnext(cb,
> > >> i_su_rank_rec->indx)) {
> > >> -                             curr_su = avd_su_get(&i_su_rank_rec-
> > >> >su_name);
> > >> +                             curr_su = su_db->find(&i_su_rank_rec-
> > >> >su_name);
> > >>                               if (curr_su == i_su_si->su)
> > >>                                       break;
> > >>                       }
> > >> @@ -324,85 +324,13 @@ AVD_SU_SI_REL *avd_susi_find(AVD_CL_CB *  {
> > >>       AVD_SU *su;
> > >>
> > >> -     if ((su = avd_su_get(su_name)) == NULL)
> > >> +     if ((su = su_db->find(su_name)) == NULL)
> > >>               return NULL;
> > >>
> > >>       return avd_su_susi_find(cb, su, si_name);  }
> > >>
> > >>
> > >>
> > /************************************************************
> > >> *****************
> > >> - * Function: avd_susi_find_next
> > >> - *
> > >> - * Purpose:  This function will find the next AVD_SU_SI_REL structure 
> > >> from
> > the
> > >> - * list of susis in a su. If NULL, it will find the first SUSI for the 
> > >> next
> > >> - * SU in the tree.
> > >> - *
> > >> - * Input: cb - the AVD control block
> > >> - *        su_name - The SU name of the SU SI relation.
> > >> - *        si_name - The SI name of the SU SI relation.
> > >> - *
> > >> - * Returns: The AVD_SU_SI_REL structure that was found.
> > >> - *
> > >> - * NOTES:
> > >> - *
> > >> - *
> > >> -
> > >>
> > *************************************************************
> > >> *************/
> > >> -
> > >> -AVD_SU_SI_REL *avd_susi_find_next(AVD_CL_CB *cb, SaNameT su_name,
> > >> SaNameT si_name)
> > >> -{
> > >> -     AVD_SU *su;
> > >> -     AVD_SU_SI_REL *su_si = NULL;
> > >> -     SaNameT lsu_name, lsi_name;
> > >> -
> > >> -     /* check if exact match of SU is found so that the next SU SI
> > >> -      * in the list of SU can be found. If not select the next SUs
> > >> -      * first SU SI relation
> > >> -      */
> > >> -     if (su_name.length != 0) {
> > >> -             su = avd_su_get(&su_name);
> > >> -             if (su == NULL)
> > >> -                     su_si = NULL;
> > >> -             else
> > >> -                     su_si = su->list_of_susi;
> > >> -     }
> > >> -
> > >> -     memset((char *)&lsi_name, '\0', sizeof(SaNameT));
> > >> -     memcpy(lsi_name.value, si_name.value, si_name.length);
> > >> -     lsi_name.length = si_name.length;
> > >> -
> > >> -     while ((su_si != NULL) && (m_CMP_HORDER_SANAMET(su_si->si-
> > >> >name, lsi_name) <= 0)) {
> > >> -             su_si = su_si->su_next;
> > >> -     }
> > >> -
> > >> -     if (su_si != NULL) {
> > >> -             return su_si;
> > >> -     }
> > >> -
> > >> -     /* Find the the first SU SI relation in the next SU with
> > >> -      * a SU SI relation.
> > >> -      */
> > >> -     lsu_name = su_name;
> > >> -
> > >> -     while ((su = avd_su_getnext(&lsu_name)) != NULL) {
> > >> -             if (su->list_of_susi != NULL)
> > >> -                     break;
> > >> -
> > >> -             lsu_name = su->name;
> > >> -     }
> > >> -
> > >> -     /* The given element didn't have a exact match but an element with
> > >> -      * a greater SI name was found in the list
> > >> -      */
> > >> -
> > >> -     if (su == NULL)
> > >> -             return NULL;
> > >> -     else
> > >> -             return su->list_of_susi;
> > >> -
> > >> -     return su_si;
> > >> -}
> > >> -
> > >> -
> > >>
> > /************************************************************
> > >> *****************
> > >>   * Function: avd_susi_delete
> > >>   *
> > >>   * Purpose:  This function will delete and free AVD_SU_SI_REL structure
> > both
> > >> 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
> > >> @@ -194,7 +194,7 @@ AVD_SUS_PER_SI_RANK *avd_sirankedsu_getn
> > >>       }
> > >>
> > >>       /* get the su & si */
> > >> -     su = avd_su_get(&ranked_su_per_si->su_name);
> > >> +     su = su_db->find(&ranked_su_per_si->su_name);
> > >>       si = avd_si_get(&indx.si_name);
> > >>
> > >>       /* validate this entry */
> > >> diff --git a/osaf/services/saf/amf/amfd/su.cc
> > >> b/osaf/services/saf/amf/amfd/su.cc
> > >> --- a/osaf/services/saf/amf/amfd/su.cc
> > >> +++ b/osaf/services/saf/amf/amfd/su.cc
> > >> @@ -29,23 +29,7 @@
> > >>  #include <proc.h>
> > >>  #include <csi.h>
> > >>
> > >> -static NCS_PATRICIA_TREE su_db;
> > >> -
> > >> -void avd_su_db_add(AVD_SU *su)
> > >> -{
> > >> -     unsigned int rc;
> > >> -
> > >> -     if (avd_su_get(&su->name) == NULL) {
> > >> -             rc = ncs_patricia_tree_add(&su_db, &su->tree_node);
> > >> -             osafassert(rc == NCSCC_RC_SUCCESS);
> > >> -     }
> > >> -}
> > >> -
> > >> -void avd_su_db_remove(AVD_SU *su)
> > >> -{
> > >> -     unsigned int rc = ncs_patricia_tree_del(&su_db, &su->tree_node);
> > >> -     osafassert(rc == NCSCC_RC_SUCCESS);
> > >> -}
> > >> +AmfDb<AVD_SU> *su_db = NULL;
> > >>
> > >>  AVD_SU *avd_su_new(const SaNameT *dn)
> > >>  {
> > >> @@ -56,7 +40,6 @@ AVD_SU *avd_su_new(const SaNameT *dn)
> > >>
> > >>       memcpy(su->name.value, dn->value, dn->length);
> > >>       su->name.length = dn->length;
> > >> -     su->tree_node.key_info = (uint8_t *)&(su->name);
> > >>       avsv_sanamet_init(dn, &sg_name, "safSg");
> > >>       su->saAmfSUFailover = false;
> > >>       su->term_state = false;
> > >> @@ -91,23 +74,13 @@ void avd_su_delete(AVD_SU *su)
> > >>       m_AVSV_SEND_CKPT_UPDT_ASYNC_RMV(avd_cb, su,
> > >> AVSV_CKPT_AVD_SU_CONFIG);
> > >>       avd_node_remove_su(su);
> > >>       avd_sutype_remove_su(su);
> > >> -     avd_su_db_remove(su);
> > >> +     su_db->erase(su);
> > >>       avd_sg_remove_su(su);
> > >>       delete su;
> > >>
> > >>       TRACE_LEAVE();
> > >>  }
> > >>
> > >> -AVD_SU *avd_su_get(const SaNameT *dn)
> > >> -{
> > >> -     SaNameT tmp = {0};
> > >> -
> > >> -     tmp.length = dn->length;
> > >> -     memcpy(tmp.value, dn->value, tmp.length);
> > >> -
> > >> -     return (AVD_SU *)ncs_patricia_tree_get(&su_db, (uint8_t *)&tmp);
> > >> -}
> > >> -
> > >>  /**
> > >>   * Return an SU object if it exist, otherwise create it and
> > >>   * return a reference to the new object.
> > >> @@ -117,27 +90,18 @@ AVD_SU *avd_su_get(const SaNameT *dn)
> > >>   */
> > >>  AVD_SU *avd_su_get_or_create(const SaNameT *dn)
> > >>  {
> > >> -     AVD_SU *su = avd_su_get(dn);
> > >> +     AVD_SU *su = su_db->find(dn);
> > >>
> > >> -     if (!su) {
> > >> +     if (su == NULL) {
> > >>               TRACE("'%s' does not exist, creating it", dn->value);
> > >>               su = avd_su_new(dn);
> > >>               osafassert(su != NULL);
> > >> -             avd_su_db_add(su);
> > >> +             su_db->insert(su);
> > >>       }
> > >>
> > >>       return su;
> > >>  }
> > >>
> > >> -AVD_SU *avd_su_getnext(const SaNameT *dn)
> > >> -{
> > >> -     SaNameT tmp = {0};
> > >> -
> > >> -     tmp.length = dn->length;
> > >> -     memcpy(tmp.value, dn->value, tmp.length);
> > >> -
> > >> -     return (AVD_SU *)ncs_patricia_tree_getnext(&su_db, (uint8_t
> > >> *)&tmp);
> > >> -}
> > >>  /**
> > >>   * @brief   gets the current no of assignmnents on a SU for a 
> > >> particular state
> > >>   *
> > >> @@ -459,7 +423,7 @@ static AVD_SU *su_create(const SaNameT *
> > >>       ** If called at new active at failover, the object is found in the 
> > >> DB
> > >>       ** but needs to get configuration attributes initialized.
> > >>       */
> > >> -     if ((su = avd_su_get(dn)) == NULL) {
> > >> +     if ((su = su_db->find(dn)) == NULL) {
> > >>               if ((su = avd_su_new(dn)) == NULL)
> > >>                       goto done;
> > >>       } else
> > >> @@ -583,7 +547,7 @@ static void su_add_to_model(AVD_SU *su)
> > >>  {
> > >>       SaNameT dn;
> > >>       AVD_AVND *node;
> > >> -     int new_su = 0;
> > >> +     bool new_su = false;
> > >>
> > >>       TRACE_ENTER2("%s", su->name.value);
> > >>
> > >> @@ -594,8 +558,8 @@ static void su_add_to_model(AVD_SU *su)
> > >>       }
> > >>
> > >>       /* Determine of the SU is added now, if so msg to amfnd needs to be
> > >> sent */
> > >> -     if (avd_su_get(&su->name) == NULL)
> > >> -             new_su = 1;
> > >> +     if (su_db->find(&su->name) == NULL)
> > >> +             new_su = true;
> > >>
> > >>       avsv_sanamet_init(&su->name, &dn, "safSg");
> > >>
> > >> @@ -607,7 +571,7 @@ static void su_add_to_model(AVD_SU *su)
> > >>       su->sg_of_su = avd_sg_get(&dn);
> > >>       osafassert(su->sg_of_su);
> > >>
> > >> -     avd_su_db_add(su);
> > >> +     su_db->insert(su);
> > >>       su->su_type = avd_sutype_get(&su->saAmfSUType);
> > >>       osafassert(su->su_type);
> > >>       avd_sutype_add_su(su);
> > >> @@ -647,7 +611,7 @@ static void su_add_to_model(AVD_SU *su)
> > >>       if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE)
> > >>               goto done;
> > >>
> > >> -     if (new_su) {
> > >> +     if (new_su == true) {
> > >>               if ((node->node_state == AVD_AVND_STATE_PRESENT) ||
> > >>                   (node->node_state == AVD_AVND_STATE_NO_CONFIG) ||
> > >>                   (node->node_state == AVD_AVND_STATE_NCS_INIT)) {
> > >> @@ -896,7 +860,7 @@ static void su_admin_op_cb(SaImmOiHandle
> > >>               goto done;
> > >>       }
> > >>
> > >> -     if (NULL == (su = avd_su_get(su_name))) {
> > >> +     if (NULL == (su = su_db->find(su_name))) {
> > >>               LOG_CR("SU '%s' not found", su_name->value);
> > >>               /* internal error? osafassert instead? */
> > >>               goto done;
> > >> @@ -1213,7 +1177,7 @@ done:
> > >>  static SaAisErrorT su_rt_attr_cb(SaImmOiHandleT immOiHandle,
> > >>       const SaNameT *objectName, const SaImmAttrNameT
> > >> *attributeNames)
> > >>  {
> > >> -     AVD_SU *su = avd_su_get(objectName);
> > >> +     AVD_SU *su = su_db->find(objectName);
> > >>       SaImmAttrNameT attributeName;
> > >>       int i = 0;
> > >>
> > >> @@ -1270,7 +1234,7 @@ static SaAisErrorT su_ccb_completed_modi
> > >>                       continue;
> > >>
> > >>               if (!strcmp(attr_mod->modAttr.attrName, "saAmfSUFailover"))
> > >> {
> > >> -                     AVD_SU *su = avd_su_get(&opdata->objectName);
> > >> +                     AVD_SU *su = su_db->find(&opdata->objectName);
> > >>                       uint32_t su_failover = *((SaUint32T *)attr_mod-
> > >> >modAttr.attrValues[0]);
> > >>
> > >>                       /* If SG is not in stable state and amfnd is 
> > >> already busy
> > >> in the handling of some fault,
> > >> @@ -1290,7 +1254,7 @@ static SaAisErrorT su_ccb_completed_modi
> > >>                               goto done;
> > >>                       }
> > >>               } else if (!strcmp(attr_mod->modAttr.attrName,
> > >> "saAmfSUMaintenanceCampaign")) {
> > >> -                     AVD_SU *su = avd_su_get(&opdata->objectName);
> > >> +                     AVD_SU *su = su_db->find(&opdata->objectName);
> > >>
> > >>                       if (su->saAmfSUMaintenanceCampaign.length > 0) {
> > >>                               report_ccb_validation_error(opdata,
> > >> "saAmfSUMaintenanceCampaign already set for %s",
> > >> @@ -1301,7 +1265,7 @@ static SaAisErrorT su_ccb_completed_modi
> > >>               } else if (!strcmp(attr_mod->modAttr.attrName,
> > >> "saAmfSUType")) {
> > >>                       AVD_SU *su;
> > >>                       SaNameT sutype_name = *(SaNameT*) attr_mod-
> > >> >modAttr.attrValues[0];
> > >> -                     su = avd_su_get(&opdata->objectName);
> > >> +                     su = su_db->find(&opdata->objectName);
> > >>                       if(SA_AMF_ADMIN_LOCKED_INSTANTIATION != su-
> > >> >saAmfSUAdminState) {
> > >>                               report_ccb_validation_error(opdata, "SU is
> > >> not in locked-inst, present state '%d'",
> > >>                                               su->saAmfSUAdminState);
> > >> @@ -1351,7 +1315,7 @@ static SaAisErrorT su_ccb_completed_dele
> > >>       if (strstr((char *)opdata->objectName.value, "safApp=OpenSAF") !=
> > >> NULL)
> > >>               is_app_su = 0;
> > >>
> > >> -     su = avd_su_get(&opdata->objectName);
> > >> +     su = su_db->find(&opdata->objectName);
> > >>       osafassert(su != NULL);
> > >>
> > >>       if (is_app_su && (su->saAmfSUAdminState !=
> > >> SA_AMF_ADMIN_LOCKED_INSTANTIATION)) {
> > >> @@ -1455,7 +1419,7 @@ static void su_ccb_apply_modify_hdlr(str
> > >>
> > >>       TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata-
> > >> >objectName.value);
> > >>
> > >> -     su = avd_su_get(&opdata->objectName);
> > >> +     su = su_db->find(&opdata->objectName);
> > >>
> > >>       while ((attr_mod = opdata->param.modify.attrMods[i++]) != NULL) {
> > >>               /* Attribute value removed */
> > >> @@ -1630,11 +1594,7 @@ void avd_su_dec_curr_stdby_si(AVD_SU *su
> > >>
> > >>  void avd_su_constructor(void)
> > >>  {
> > >> -     NCS_PATRICIA_PARAMS patricia_params;
> > >> -
> > >> -     patricia_params.key_size = sizeof(SaNameT);
> > >> -     osafassert(ncs_patricia_tree_init(&su_db, &patricia_params) ==
> > >> NCSCC_RC_SUCCESS);
> > >> -
> > >> +     su_db = new AmfDb<AVD_SU>;
> > >>       avd_class_impl_set("SaAmfSU", su_rt_attr_cb, su_admin_op_cb,
> > >>               su_ccb_completed_cb, su_ccb_apply_cb);
> > >>  }
> > >> diff --git a/osaf/services/saf/amf/amfd/util.cc
> > >> b/osaf/services/saf/amf/amfd/util.cc
> > >> --- a/osaf/services/saf/amf/amfd/util.cc
> > >> +++ b/osaf/services/saf/amf/amfd/util.cc
> > >> @@ -24,6 +24,7 @@
> > >>
> > >>
> > *************************************************************
> > >> *****************
> > >>  */
> > >>
> > >> +#include <vector>
> > >>  #include <string.h>
> > >>
> > >>  #include <saImmOm.h>
> > >> @@ -445,34 +446,15 @@ done:
> > >>       return rc;
> > >>  }
> > >>
> > >> -
> > >>
> > /************************************************************
> > >> *****************
> > >> - * Function: avd_prep_su_info
> > >> - *
> > >> - * Purpose:  This function prepares the SU
> > >> - * information for the given SU and adds it to the message.
> > >> - *
> > >> - * Input: cb - Pointer to the AVD control block
> > >> - *        su - Pointer to the SU related to which the messages need to 
> > >> be sent.
> > >> - *        su_msg - Pointer to the SU message being prepared.
> > >> - *
> > >> - * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
> > >> - *
> > >> - * NOTES: none.
> > >> - *
> > >> - *
> > >> -
> > >>
> > *************************************************************
> > >> *************/
> > >> +/**
> > >> + * Creates and initializes the su_info part of the REG_SU message
> > >> + * @param su
> > >> + * @param su_msg
> > >> + */
> > >> +static void reg_su_msg_init_su_info(AVD_DND_MSG *su_msg, const
> > AVD_SU
> > >> *su)
> > >> +{
> > >> +     AVSV_SU_INFO_MSG *su_info = new AVSV_SU_INFO_MSG();
> > >>
> > >> -static uint32_t avd_prep_su_info(AVD_CL_CB *cb, AVD_SU *su,
> > >> AVD_DND_MSG *su_msg)
> > >> -{
> > >> -     AVSV_SU_INFO_MSG *su_info;
> > >> -
> > >> -     TRACE_ENTER();
> > >> -
> > >> -     su_info = new AVSV_SU_INFO_MSG();
> > >> -
> > >> -     /* fill and add the SU into
> > >> -      * the SU message at the top of the list
> > >> -      */
> > >>       su_info->name = su->name;
> > >>       su_info->comp_restart_max = su->sg_of_su-
> > >> >saAmfSGCompRestartMax;
> > >>       su_info->comp_restart_prob = su->sg_of_su-
> > >> >saAmfSGCompRestartProb;
> > >> @@ -485,9 +467,6 @@ static uint32_t avd_prep_su_info(AVD_CL_
> > >>       su_info->next = su_msg->msg_info.d2n_reg_su.su_list;
> > >>       su_msg->msg_info.d2n_reg_su.su_list = su_info;
> > >>       su_msg->msg_info.d2n_reg_su.num_su++;
> > >> -
> > >> -     return NCSCC_RC_SUCCESS;
> > >> -
> > >>  }
> > >>
> > >>
> > >>
> > /************************************************************
> > >> *****************
> > >> @@ -508,71 +487,40 @@ static uint32_t avd_prep_su_info(AVD_CL_
> > >>
> > >>  uint32_t avd_snd_su_reg_msg(AVD_CL_CB *cb, AVD_AVND *avnd, bool
> > >> fail_over)
> > >>  {
> > >> -     AVD_SU *i_su = NULL;
> > >> -     AVD_DND_MSG *su_msg;
> > >> -     uint32_t i, count = 0;
> > >> -     SaNameT temp_su_name = {0};
> > >> +     AVD_SU *su = NULL;
> > >>       uint32_t rc = NCSCC_RC_SUCCESS;
> > >>
> > >>       TRACE_ENTER2("%s", avnd->node_name);
> > >>
> > >> -     su_msg = new AVSV_DND_MSG();
> > >> -
> > >> -     /* prepare the SU message. */
> > >> +     AVD_DND_MSG *su_msg = new AVSV_DND_MSG();
> > >>       su_msg->msg_type = AVSV_D2N_REG_SU_MSG;
> > >>       su_msg->msg_info.d2n_reg_su.nodeid = avnd->node_info.nodeId;
> > >>       su_msg->msg_info.d2n_reg_su.msg_on_fover = fail_over;
> > >>
> > >> -     /* build the SU message for both the NCS and application SUs. */
> > >> +     // Add osaf SUs
> > >> +     for (su = avnd->list_of_ncs_su; su != NULL; su = 
> > >> su->avnd_list_su_next)
> > >> +             reg_su_msg_init_su_info(su_msg, su);
> > >>
> > >> -     /* Check whether the AvND belongs to ACT controller. If yes, then 
> > >> send
> > >> all
> > >> -        the external SUs/Components to it, otherwise send only cluster
> > >> -        components. */
> > >> +     // Add app SUs
> > >> +     for (su = avnd->list_of_su; su != NULL; su = su->avnd_list_su_next)
> > >> +             reg_su_msg_init_su_info(su_msg, su);
> > >> +
> > >> +     // Add external SUs but only if node belongs to ACT controller
> > >>       if (avnd->node_info.nodeId == cb->node_id_avd) {
> > >> -             count = 2;
> > >> -     } else
> > >> -             count = 1;
> > >> -
> > >> -     for (i = 0; i <= count; ++i) {
> > >> -             if (i == 0)
> > >> -                     i_su = avnd->list_of_ncs_su;
> > >> -             else if (i == 1)
> > >> -                     i_su = avnd->list_of_su;
> > >> -             else {
> > >> -                     /* For external component, we don't have any node
> > >> attached to it.
> > >> -                        So, get the first external SU. */
> > >> -                     temp_su_name.length = 0;
> > >> -                     while (NULL != (i_su =
> > >> avd_su_getnext(&temp_su_name))) {
> > >> -                             if (true == i_su->su_is_external)
> > >> -                                     break;
> > >> -
> > >> -                             temp_su_name = i_su->name;
> > >> -                     }
> > >> +             // filter out external SUs from all SUs
> > >> +             std::vector<AVD_SU*> ext_su_vec;
> > >> +             for (std::map<std::string, AVD_SU*>::const_iterator it = 
> > >> su_db-
> > >> >begin();
> > >> +                             it != su_db->end(); it++) {
> > >> +                     su = it->second;
> > >> +                     if (su->su_is_external == true)
> > >> +                             ext_su_vec.push_back(su);
> > >>               }
> > >>
> > >> -             while (i_su != NULL) {
> > >> -                     /* Add information about this SU to the message */
> > >> -                     if (avd_prep_su_info(cb, i_su, su_msg) ==
> > >> NCSCC_RC_FAILURE) {
> > >> -                             /* Free all the messages and return error 
> > >> */
> > >> -                             d2n_msg_free(su_msg);
> > >> -                             LOG_EM("%s:%u: %u", __FILE__, __LINE__,
> > >> avnd->node_info.nodeId);
> > >> -                             rc = NCSCC_RC_FAILURE;
> > >> -                             goto done;
> > >> -                     }
> > >> -
> > >> -                     /* get the next SU in the node */
> > >> -                     if ((0 == i) || (1 == i))
> > >> -                             i_su = i_su->avnd_list_su_next;
> > >> -                     else {
> > >> -                             /* Get the next external SU. */
> > >> -                             temp_su_name = i_su->name;
> > >> -                             while (NULL != (i_su =
> > >> avd_su_getnext(&temp_su_name))) {
> > >> -                                     if (true == i_su->su_is_external)
> > >> -                                             break;
> > >> -
> > >> -                                     temp_su_name = i_su->name;
> > >> -                             }
> > >> -                     }
> > >> +             // And add them
> > >> +             for (std::vector<AVD_SU*>::iterator it = 
> > >> ext_su_vec.begin();
> > >> +                             it != ext_su_vec.end(); it++) {
> > >> +                     su = *it;
> > >> +                     reg_su_msg_init_su_info(su_msg, su);
> > >>               }
> > >>       }
> > >>
> > >> @@ -627,45 +575,18 @@ done:
> > >>
> > >>  uint32_t avd_snd_su_msg(AVD_CL_CB *cb, AVD_SU *su)
> > >>  {
> > >> -     AVD_DND_MSG *su_msg;
> > >>       AVD_AVND *node = NULL;
> > >>
> > >>       TRACE_ENTER();
> > >>
> > >> -     if (su == NULL) {
> > >> -             /* This is a invalid situation as the SU
> > >> -              * needs to be mentioned.
> > >> -              */
> > >> -
> > >> -             /* Log a fatal error that su can't be null */
> > >> -             LOG_EM("%s:%u: %u", __FILE__, __LINE__, 0);
> > >> -             return NCSCC_RC_FAILURE;
> > >> -     }
> > >> -
> > >>       m_AVD_GET_SU_NODE_PTR(cb, su, node);
> > >>
> > >> -     su_msg = new AVSV_DND_MSG();
> > >> -
> > >> -     /* prepare the SU  message. */
> > >> -
> > >> +     AVD_DND_MSG *su_msg = new AVSV_DND_MSG();
> > >>       su_msg->msg_type = AVSV_D2N_REG_SU_MSG;
> > >> -
> > >>       su_msg->msg_info.d2n_reg_su.nodeid = node->node_info.nodeId;
> > >> -
> > >> -     /* Add information about this SU to the message */
> > >> -     if (avd_prep_su_info(cb, su, su_msg) == NCSCC_RC_FAILURE) {
> > >> -             /* Free the messages and return error */
> > >> -             LOG_EM("%s:%u: %u", __FILE__, __LINE__, node-
> > >> >node_info.nodeId);
> > >> -             delete su_msg;
> > >> -             return NCSCC_RC_FAILURE;
> > >> -     }
> > >> -
> > >> +     reg_su_msg_init_su_info(su_msg, su);
> > >>       su_msg->msg_info.d2n_reg_su.msg_id = ++(node->snd_msg_id);
> > >>
> > >> -     /* send the SU message to the node if return value is failure
> > >> -      * free messages and return error.
> > >> -      */
> > >> -
> > >>       TRACE("Sending %u to %x", AVSV_D2N_REG_SU_MSG, node-
> > >> >node_info.nodeId);
> > >>
> > >>       if (avd_d2n_msg_snd(cb, node, su_msg) == NCSCC_RC_FAILURE) {
> > >> @@ -1468,9 +1389,9 @@ void amfd_file_dump(const char *path)
> > >>               dn = sg->name;
> > >>       }
> > >>
> > >> -     AVD_SU *su;
> > >> -     dn.length = 0;
> > >> -     for (su = avd_su_getnext(&dn); su != NULL; su = 
> > >> avd_su_getnext(&dn))
> > >> {
> > >> +     for (std::map<std::string, AVD_SU*>::const_iterator it = su_db-
> > >> >begin();
> > >> +                     it != su_db->end(); it++) {
> > >> +             const AVD_SU *su = it->second;
> > >>               fprintf(f, "%s\n", su->name.value);
> > >>               fprintf(f, "\tsaAmfSUPreInstantiable=%u\n", su-
> > >> >saAmfSUPreInstantiable);
> > >>               fprintf(f, "\tsaAmfSUOperState=%u\n", su-
> > >> >saAmfSUOperState);
> > >> @@ -1512,14 +1433,14 @@ void amfd_file_dump(const char *path)
> > >>       }
> > >>
> > >>       AVD_SU_SI_REL *rel;
> > >> -     dn.length = 0;
> > >> -     for (su = avd_su_getnext(&dn); su != NULL; su = 
> > >> avd_su_getnext(&dn))
> > >> {
> > >> +     for (std::map<std::string, AVD_SU*>::const_iterator it = su_db-
> > >> >begin();
> > >> +                     it != su_db->end(); it++) {
> > >> +             const AVD_SU *su = it->second;
> > >>               for (rel = su->list_of_susi; rel != NULL; rel = 
> > >> rel->su_next) {
> > >>                       fprintf(f, "%s,%s\n", rel->su->name.value, rel->si-
> > >> >name.value);
> > >>                       fprintf(f, "\thastate=%u\n", rel->state);
> > >>                       fprintf(f, "\tfsm=%u\n", rel->fsm);
> > >>               }
> > >> -             dn = su->name;
> > >>       }
> > >>
> > >>       dn.length = 0;
> 
> ------------------------------------------------------------------------------
> Start Your Social Network Today - Download eXo Platform
> Build your Enterprise Intranet with eXo Platform Software
> Java Based Open Source Intranet - Social, Extensible, Cloud Ready
> Get Started Now And Turn Your Intranet Into A Collaboration Platform
> http://p.sf.net/sfu/ExoPlatform
> _______________________________________________
> Opensaf-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/opensaf-devel

------------------------------------------------------------------------------
Start Your Social Network Today - Download eXo Platform
Build your Enterprise Intranet with eXo Platform Software
Java Based Open Source Intranet - Social, Extensible, Cloud Ready
Get Started Now And Turn Your Intranet Into A Collaboration Platform
http://p.sf.net/sfu/ExoPlatform
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to