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 > >>>> + } >>>> } >>>> >>>> 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