see comment below/Thanks HansN On 09/09/2015 01:53 PM, Nagendra Kumar wrote: > 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 ? [HansN] yes, the elements to be erased are at the new 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