Please check my comment below

Thanks
-Nagu
> -----Original Message-----
> From: Hans Nordebäck [mailto:hans.nordeb...@ericsson.com]
> Sent: 09 September 2015 15:59
> To: Nagendra Kumar; Praveen Malviya; gary....@dektech.com.au
> Cc: opensaf-devel@lists.sourceforge.net
> Subject: Re: [PATCH 10 of 10] amfd: Make AVD_SUTYPE a class [#1142]
> 
> Hi Nagu,
> 
> please see comment inlined with [HansN] /Thanks HansN
> 
> On 09/09/2015 11:58 AM, Nagendra Kumar wrote:
> > Please find comment inlined with [Nagu].
> >
> > Thanks
> > -Nagu
> >> -----Original Message-----
> >> From: Hans Nordeback [mailto:hans.nordeb...@ericsson.com]
> >> Sent: 14 August 2015 20:20
> >> To: Praveen Malviya; Nagendra Kumar; gary....@dektech.com.au
> >> Cc: opensaf-devel@lists.sourceforge.net
> >> Subject: [PATCH 10 of 10] amfd: Make AVD_SUTYPE a class [#1142]
> >>
> >>   osaf/services/saf/amf/amfd/include/su.h          |    3 +-
> >>   osaf/services/saf/amf/amfd/include/sutcomptype.h |    2 +-
> >>   osaf/services/saf/amf/amfd/include/sutype.h      |   24 +++-
> >>   osaf/services/saf/amf/amfd/sgtype.cc             |    2 +-
> >>   osaf/services/saf/amf/amfd/su.cc                 |    6 +-
> >>   osaf/services/saf/amf/amfd/sutcomptype.cc        |    2 +-
> >>   osaf/services/saf/amf/amfd/sutype.cc             |  108 
> >> +++++++++-------------
> >>   7 files changed, 70 insertions(+), 77 deletions(-)
> >>
> >>
> >> 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,6 +35,7 @@
> >>   #include "include/db_template.h"
> >>
> >>   class AVD_SG;
> >> +class AVD_SUTYPE;
> >>
> >>   /**
> >>    * AMF director Service Unit representation.
> >> @@ -94,7 +95,7 @@ class AVD_SU {
> >>
> >>    AVD_SU *sg_list_su_next;        /* the next SU in the SG */
> >>    AVD_SU *avnd_list_su_next;      /* the next SU in the AvND */
> >> -  struct avd_sutype *su_type;
> >> +  AVD_SUTYPE *su_type;
> >>    AVD_SU *su_list_su_type_next;
> >>
> >>    void set_su_failover(bool value);
> >> diff --git a/osaf/services/saf/amf/amfd/include/sutcomptype.h
> >> b/osaf/services/saf/amf/amfd/include/sutcomptype.h
> >> --- a/osaf/services/saf/amf/amfd/include/sutcomptype.h
> >> +++ b/osaf/services/saf/amf/amfd/include/sutcomptype.h
> >> @@ -36,7 +36,7 @@ typedef struct {
> >>   } AVD_SUTCOMP_TYPE;
> >>   extern AmfDb<std::string, AVD_SUTCOMP_TYPE> *sutcomptype_db;
> >>
> >> -SaAisErrorT avd_sutcomptype_config_get(SaNameT *sutype_name, struct
> >> avd_sutype *sut);
> >> +SaAisErrorT avd_sutcomptype_config_get(SaNameT *sutype_name,
> >> AVD_SUTYPE *sut);
> >>   void avd_sutcomptype_constructor(void);
> >>
> >>   #endif
> >> diff --git a/osaf/services/saf/amf/amfd/include/sutype.h
> >> b/osaf/services/saf/amf/amfd/include/sutype.h
> >> --- a/osaf/services/saf/amf/amfd/include/sutype.h
> >> +++ b/osaf/services/saf/amf/amfd/include/sutype.h
> >> @@ -20,16 +20,24 @@
> >>
> >>   #include <saAis.h>
> >>   #include <su.h>
> >> +#include <vector>
> >>
> >> -struct avd_sutype {
> >> -  SaNameT name;
> >> -  SaUint32T saAmfSutIsExternal;
> >> -  SaUint32T saAmfSutDefSUFailover;
> >> -  SaNameT *saAmfSutProvidesSvcTypes; /* array of DNs, size in
> >> number_svc_types */
> >> -  unsigned int number_svc_types;  /* size of array
> >> saAmfSutProvidesSvcTypes */
> >> -  AVD_SU *list_of_su;
> >> +class AVD_SUTYPE {
> >> + public:
> >> +  explicit AVD_SUTYPE(const SaNameT *dn);
> >> +  SaNameT name {};
> >> +  SaUint32T saAmfSutIsExternal {};
> >> +  SaUint32T saAmfSutDefSUFailover {};
> >> +  SaNameT *saAmfSutProvidesSvcTypes {}; /* array of DNs, size in
> >> number_svc_types */
> >> +  unsigned int number_svc_types {};       /* size of array
> >> saAmfSutProvidesSvcTypes */
> >> +  std::vector<AVD_SU*> list_of_su {};
> >> + private:
> >> +  AVD_SUTYPE();
> >> +  // disallow copy and assign
> >> +  AVD_SUTYPE(const AVD_SUTYPE&);
> >> +  void operator=(const AVD_SUTYPE&);
> >>   };
> >> -extern AmfDb<std::string, avd_sutype> *sutype_db;
> >> +extern AmfDb<std::string, AVD_SUTYPE> *sutype_db;
> >>
> >>   /**
> >>    * Get SaAmfSUType from IMM and create internal objects diff --git
> >> a/osaf/services/saf/amf/amfd/sgtype.cc
> >> b/osaf/services/saf/amf/amfd/sgtype.cc
> >> --- a/osaf/services/saf/amf/amfd/sgtype.cc
> >> +++ b/osaf/services/saf/amf/amfd/sgtype.cc
> >> @@ -84,7 +84,7 @@ static int is_config_valid(const SaNameT
> >>    char *parent;
> >>    SaUint32T value;
> >>    SaBoolT abool;
> >> -  struct avd_sutype *sut;
> >> +  AVD_SUTYPE *sut;
> >>    const SaImmAttrValuesT_2 *attr;
> >>
> >>    if ((parent = strchr((char*)dn->value, ',')) == NULL) { 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
> >> @@ -230,7 +230,7 @@ static int is_config_valid(const SaNameT
> >>    SaAmfAdminStateT admstate;
> >>    char *parent;
> >>    SaUint32T saAmfSutIsExternal;
> >> -  struct avd_sutype *sut = NULL;
> >> +  AVD_SUTYPE *sut = NULL;
> >>    CcbUtilOperationData_t *tmp;
> >>    AVD_SG *sg;
> >>
> >> @@ -416,7 +416,7 @@ static AVD_SU *su_create(const SaNameT *
> >>   {
> >>    int rc = -1;
> >>    AVD_SU *su;
> >> -  struct avd_sutype *sut;
> >> +  AVD_SUTYPE *sut;
> >>    SaAisErrorT error;
> >>
> >>    TRACE_ENTER2("'%s'", dn->value);
> >> @@ -1691,7 +1691,7 @@ static void su_ccb_apply_modify_hdlr(str
> >>                                      su-
> >>> saAmfSUMaintenanceCampaign.value, su->name.value);
> >>                    }
> >>            } else if (!strcmp(attr_mod->modAttr.attrName,
> >> "saAmfSUType")) {
> >> -                  struct avd_sutype *sut;
> >> +                  AVD_SUTYPE *sut;
> >>                    SaNameT sutype_name = *(SaNameT*) attr_mod-
> >>> modAttr.attrValues[0];
> >>                    TRACE("Modified saAmfSUType from '%s' to '%s'", su-
> >>> saAmfSUType.value, sutype_name.value);
> >>                    sut = sutype_db-
> >>> find(Amf::to_string(&sutype_name));
> >> diff --git a/osaf/services/saf/amf/amfd/sutcomptype.cc
> >> b/osaf/services/saf/amf/amfd/sutcomptype.cc
> >> --- a/osaf/services/saf/amf/amfd/sutcomptype.cc
> >> +++ b/osaf/services/saf/amf/amfd/sutcomptype.cc
> >> @@ -65,7 +65,7 @@ static int is_config_valid(const SaNameT
> >>    return 1;
> >>   }
> >>
> >> -SaAisErrorT avd_sutcomptype_config_get(SaNameT *sutype_name, struct
> >> avd_sutype *sut)
> >> +SaAisErrorT avd_sutcomptype_config_get(SaNameT *sutype_name,
> >> AVD_SUTYPE *sut)
> >>   {
> >>    AVD_SUTCOMP_TYPE *sutcomptype;
> >>    SaAisErrorT error;
> >> diff --git a/osaf/services/saf/amf/amfd/sutype.cc
> >> b/osaf/services/saf/amf/amfd/sutype.cc
> >> --- a/osaf/services/saf/amf/amfd/sutype.cc
> >> +++ b/osaf/services/saf/amf/amfd/sutype.cc
> >> @@ -27,37 +27,41 @@
> >>   #include <cluster.h>
> >>   #include <ntf.h>
> >>   #include <proc.h>
> >> +#include <algorithm>
> >>
> >> -AmfDb<std::string, avd_sutype> *sutype_db = NULL;
> >> +AmfDb<std::string, AVD_SUTYPE> *sutype_db = NULL;
> >>
> >> -static struct avd_sutype *sutype_new(const SaNameT *dn)
> >> +//
> >> +AVD_SUTYPE::AVD_SUTYPE(const SaNameT *dn) {
> >> +  memcpy(&name.value, dn->value, dn->length);
> >> +  name.length = dn->length;
> >> +}
> >> +
> >> +static AVD_SUTYPE *sutype_new(const SaNameT *dn)
> >>   {
> >> -  struct avd_sutype *sutype = new avd_sutype();
> >> -
> >> -  memcpy(sutype->name.value, dn->value, dn->length);
> >> -  sutype->name.length = dn->length;
> >> +  AVD_SUTYPE *sutype = new AVD_SUTYPE(dn);
> >>
> >>    return sutype;
> >>   }
> >>
> >> -static void sutype_delete(struct avd_sutype **sutype)
> >> +static void sutype_delete(AVD_SUTYPE **sutype)
> >>   {
> >> -  osafassert(NULL == (*sutype)->list_of_su);
> >> +  osafassert(true == (*sutype)->list_of_su.empty());
> >>    delete [] (*sutype)->saAmfSutProvidesSvcTypes;
> >>    delete *sutype;
> >>    *sutype = NULL;
> >>   }
> >>
> >> -static void sutype_db_add(struct avd_sutype *sutype)
> >> +static void sutype_db_add(AVD_SUTYPE *sutype)
> >>   {
> >>    unsigned int rc = sutype_db->insert(Amf::to_string(&sutype-
> >>> name),sutype);
> >>    osafassert(rc == NCSCC_RC_SUCCESS);
> >>   }
> >>
> >> -static struct avd_sutype *sutype_create(const SaNameT *dn, const
> >> SaImmAttrValuesT_2 **attributes)
> >> +static AVD_SUTYPE *sutype_create(const SaNameT *dn, const
> >> SaImmAttrValuesT_2 **attributes)
> >>   {
> >>    const SaImmAttrValuesT_2 *attr;
> >> -  struct avd_sutype *sutype;
> >> +  AVD_SUTYPE *sutype;
> >>    int rc = 0;
> >>    unsigned i = 0;
> >>    SaAisErrorT error;
> >> @@ -166,7 +170,7 @@ static int is_config_valid(const SaNameT
> >>
> >>   SaAisErrorT avd_sutype_config_get(void)
> >>   {
> >> -  struct avd_sutype *sut;
> >> +  AVD_SUTYPE *sut;
> >>    SaAisErrorT error;
> >>    SaImmSearchHandleT searchHandle;
> >>    SaImmSearchParametersT_2 searchParam; @@ -228,7 +232,7 @@
> static
> >> void sutype_ccb_apply_modify_hdlr
> >>    int i = 0;
> >>
> >>    TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata-
> >>> objectName.value);
> >> -  avd_sutype *sut = sutype_db->find(Amf::to_string(&opdata-
> >>> objectName));
> >> +  AVD_SUTYPE *sut = sutype_db->find(Amf::to_string(&opdata-
> >>> objectName));
> >>    while ((attr_mod = opdata->param.modify.attrMods[i++]) != NULL) {
> >>            if (!strcmp(attr_mod->modAttr.attrName,
> >> "saAmfSutDefSUFailover")) {
> >> @@ -239,7 +243,7 @@ static void sutype_ccb_apply_modify_hdlr
> >>                    /* Modify saAmfSUFailover for SUs which had
> inherited
> >> saAmfSutDefSUFailover.
> >>                            Modification will not be done for the NPI SU
> */
> >>                    if (old_value != sut->saAmfSutDefSUFailover) {
> >> -                          for (AVD_SU *su = sut->list_of_su; su; su = su-
> >>> su_list_su_type_next) {
> >> +                          for (const auto& su : sut->list_of_su) {
> >>                                    if ((!su->saAmfSUFailover_configured)
> >> && (su->saAmfSUPreInstantiable)) {
> >>                                            su-
> >>> set_su_failover(static_cast<bool>(sut->saAmfSutDefSUFailover));
> >>                                    }
> >> @@ -255,7 +259,7 @@ static void sutype_ccb_apply_modify_hdlr
> >>
> >>   static void sutype_ccb_apply_cb(CcbUtilOperationData_t *opdata)
> >>   {
> >> -  struct avd_sutype *sut;
> >> +  AVD_SUTYPE *sut;
> >>
> >>    TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata-
> >>> objectName.value);
> >> @@ -291,7 +295,7 @@ static SaAisErrorT sutype_ccb_completed_
> >>    SaAisErrorT rc = SA_AIS_OK;
> >>    const SaImmAttrModificationT_2 *attr_mod;
> >>    int i = 0;
> >> -  avd_sutype *sut = sutype_db->find(Amf::to_string(&opdata-
> >>> objectName));
> >> +  AVD_SUTYPE *sut = sutype_db->find(Amf::to_string(&opdata-
> >>> objectName));
> >>    TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata-
> >>> objectName.value);
> >>    while ((attr_mod = opdata->param.modify.attrMods[i++]) != NULL) {
> >> @@ -311,7 +315,7 @@ static SaAisErrorT sutype_ccb_completed_
> >>                            goto done;
> >>                    }
> >>
> >> -                  for (AVD_SU *su = sut->list_of_su; su; su = su-
> >>> su_list_su_type_next) {
> >> +                  for (const auto& su : sut->list_of_su) {
> >>                            if (su->saAmfSUFailover_configured)
> >>                                    continue;
> >>
> >> @@ -341,8 +345,7 @@ done:
> >>   static SaAisErrorT sutype_ccb_completed_cb(CcbUtilOperationData_t
> >> *opdata)
> >>   {
> >>    SaAisErrorT rc = SA_AIS_ERR_BAD_OPERATION;
> >> -  struct avd_sutype *sut;
> >> -  AVD_SU *su;
> >> +  AVD_SUTYPE *sut;
> >>    bool su_exist = false;
> >>    CcbUtilOperationData_t *t_opData;
> >>
> >> @@ -358,24 +361,23 @@ static SaAisErrorT sutype_ccb_completed_
> >>            break;
> >>    case CCBUTIL_DELETE:
> >>            sut = sutype_db->find(Amf::to_string(&opdata->objectName));
> >> -          if (NULL != sut->list_of_su) {
> >> -                  /* check whether there exists a delete operation for
> >> -                   * each of the SU in the su_type list in the current CCB
> >> -                   */
> >> -                  su = sut->list_of_su;
> >> -                  while (su != NULL) {
> >> -                          t_opData =
> >> ccbutil_getCcbOpDataByDN(opdata->ccbId, &su->name);
> >> -                          if ((t_opData == NULL) || (t_opData-
> >>> operationType != CCBUTIL_DELETE)) {
> >> -                                  su_exist = true;
> >> -                                  break;
> >> -                          }
> >> -                          su = su->su_list_su_type_next;
> >> -                  }
> >> -                  if (su_exist == true) {
> >> -                          report_ccb_validation_error(opdata,
> >> "SaAmfSUType '%s'is in use",sut->name.value);
> >> -                          goto done;
> >> +
> >> +          /* check whether there exists a delete operation for
> >> +           * each of the SU in the su_type list in the current CCB
> >> +           */
> >> +
> >> +          for (const auto& su : sut->list_of_su) {
> >> +                  t_opData = ccbutil_getCcbOpDataByDN(opdata-
> >>> ccbId, &su->name);
> >> +                  if ((t_opData == NULL) || (t_opData->operationType
> >> != CCBUTIL_DELETE)) {
> >> +                          su_exist = true;
> >> +                          break;
> >>                    }
> >>            }
> >> +
> >> +          if (su_exist == true) {
> >> +                  report_ccb_validation_error(opdata, "SaAmfSUType
> >> '%s'is in use",sut->name.value);
> >> +                  goto done;
> >> +          }
> >>            rc = SA_AIS_OK;
> >>            break;
> >>    default:
> >> @@ -391,41 +393,23 @@ done:
> >>    /* Add SU to list in SU Type */
> >>   void avd_sutype_add_su(AVD_SU* su)
> >>   {
> >> -  struct avd_sutype *sut = su->su_type;
> >> -  su->su_list_su_type_next = sut->list_of_su;
> >> -  sut->list_of_su = su;
> >> +  AVD_SUTYPE *sut = su->su_type;
> >> +  sut->list_of_su.push_back(su);
> >>   }
> >>
> >> -void avd_sutype_remove_su(AVD_SU* su) -{
> >> -  AVD_SU *i_su = NULL;
> >> -  AVD_SU *prev_su = NULL;
> >> +void avd_sutype_remove_su(AVD_SU* su) {
> >> +  AVD_SUTYPE *su_type = su->su_type;
> >>
> >> -  if (su->su_type != NULL) {
> >> -          i_su = su->su_type->list_of_su;
> >> -
> >> -          while ((i_su != NULL) && (i_su != su)) {
> >> -                  prev_su = i_su;
> >> -                  i_su = i_su->su_list_su_type_next;
> >> -          }
> >> -
> >> -          if (i_su == su) {
> >> -                  if (prev_su == NULL) {
> >> -                          su->su_type->list_of_su = su-
> >>> su_list_su_type_next;
> >> -                  } else {
> >> -                          prev_su->su_list_su_type_next = su-
> >>> su_list_su_type_next;
> >> -                  }
> >> -
> >> -                  su->su_list_su_type_next = NULL;
> >> -                  su->su_type = NULL;
> >> -          }
> >> -  }
> >> +  if (su_type != nullptr) {
> >> +    su_type->list_of_su.erase(std::remove(su_type->list_of_su.begin(),
> >> +                                          su_type->list_of_su.end(),
> >> + su), su_type-
> >>> list_of_su.end());
> > [Nagu]: Looks complex to understand, can it be done as like #9th of patch
> series?
> [HansN] It can be done like #9th patch, the reason std::find is used in
> #9 is because
> of the osafassert, that checks if si exists in svc_type->list_of_si, this is 
> not
> needed in #10.
> The use of std::remove, in #10, is to show an alternative and (in my
> opinion) easier way
> to express the remove/erase idiom.

[Nagu]: I got confused with erase taking first element as 'an element after 
remove' and then it erases from
 'removed item till end of the list i.e. range ?' Am I right ? can we refactor 
it ?

> >
> >> +  }
> >>   }
> >>
> >>   void avd_sutype_constructor(void)
> >>   {
> >>
> >> -  sutype_db = new AmfDb<std::string, avd_sutype>;
> >> +  sutype_db = new AmfDb<std::string, AVD_SUTYPE>;
> >>    avd_class_impl_set("SaAmfSUBaseType", NULL, NULL,
> >>            avd_imm_default_OK_completed_cb, NULL);
> >>    avd_class_impl_set("SaAmfSUType", NULL, NULL,
> 

------------------------------------------------------------------------------
Monitor Your Dynamic Infrastructure at Any Scale With Datadog!
Get real-time metrics from all of your servers, apps and tools
in one place.
SourceForge users - Click here to start your Free Trial of Datadog now!
http://pubads.g.doubleclick.net/gampad/clk?id=241902991&iu=/4140
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to