Thanks for the clarification, few more needed, please check below. > -----Original Message----- > From: Hans Nordebäck [mailto:hans.nordeb...@ericsson.com] > Sent: 09 September 2015 17:09 > 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 my comment inlined with [HansN] /Thanks HansN > > On 09/09/2015 01:13 PM, Nagendra Kumar wrote: > > 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 > ? > [HansN] > The std::remove doesn't remove anything it returns a new iterator to a > new end where objects to be erased has > been transformed. Please see e.g. > http://www.cplusplus.com/reference/algorithm/remove/?kw=remove
[Nagu]: Yes, I had read it before and I found it confusing. That means the statement is equivalent to : su_type->list_of_su.erase(Iterator, su_type-> list_of_su.end()) So, does it erase a range of elements from iterator till end ? > > > >>>> + } > >>>> } > >>>> > >>>> 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