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