osaf/services/saf/amf/amfd/include/sg.h | 3 +- osaf/services/saf/amf/amfd/include/sgtype.h | 39 ++++++++----- osaf/services/saf/amf/amfd/sg.cc | 1 - osaf/services/saf/amf/amfd/sgtype.cc | 84 +++++++++++----------------- 4 files changed, 59 insertions(+), 68 deletions(-)
diff --git a/osaf/services/saf/amf/amfd/include/sg.h b/osaf/services/saf/amf/amfd/include/sg.h --- a/osaf/services/saf/amf/amfd/include/sg.h +++ b/osaf/services/saf/amf/amfd/include/sg.h @@ -192,8 +192,7 @@ public: SaInvocationT adminOp_invocationId; SaAmfAdminOperationIdT adminOp; - AVD_SG *sg_list_sg_type_next; - struct avd_amf_sg_type_tag *sg_type; + AVD_AMF_SG_TYPE *sg_type; AVD_SG *sg_list_app_next; AVD_APP *app; bool equal_ranked_su; /* This flag is set when ranks of all SU is the same. diff --git a/osaf/services/saf/amf/amfd/include/sgtype.h b/osaf/services/saf/amf/amfd/include/sgtype.h --- a/osaf/services/saf/amf/amfd/include/sgtype.h +++ b/osaf/services/saf/amf/amfd/include/sgtype.h @@ -27,28 +27,37 @@ #include <saAmf.h> #include <include/db_template.h> +#include <vector> class AVD_SG; -typedef struct avd_amf_sg_type_tag { - SaNameT name; - bool saAmfSgtDefAutoRepair_configured; /* True when user configures saAmfSGDefAutoRepair else false */ +class AVD_AMF_SG_TYPE { + public: + explicit AVD_AMF_SG_TYPE(const SaNameT *dn); + SaNameT name {}; + bool saAmfSgtDefAutoRepair_configured {}; /* True when user configures saAmfSGDefAutoRepair else false */ /******************** B.04 model *************************************************/ - SaNameT *saAmfSGtValidSuTypes; /* array of DNs, size in number_su_type */ - SaAmfRedundancyModelT saAmfSgtRedundancyModel; - SaBoolT saAmfSgtDefAutoRepair; - SaBoolT saAmfSgtDefAutoAdjust; - SaTimeT saAmfSgtDefAutoAdjustProb; - SaTimeT saAmfSgtDefCompRestartProb; - SaUint32T saAmfSgtDefCompRestartMax; - SaTimeT saAmfSgtDefSuRestartProb; - SaUint32T saAmfSgtDefSuRestartMax; + SaNameT *saAmfSGtValidSuTypes {}; /* array of DNs, size in number_su_type */ + SaAmfRedundancyModelT saAmfSgtRedundancyModel {}; + SaBoolT saAmfSgtDefAutoRepair {}; + SaBoolT saAmfSgtDefAutoAdjust {}; + SaTimeT saAmfSgtDefAutoAdjustProb {}; + SaTimeT saAmfSgtDefCompRestartProb {}; + SaUint32T saAmfSgtDefCompRestartMax {}; + SaTimeT saAmfSgtDefSuRestartProb {}; + SaUint32T saAmfSgtDefSuRestartMax {}; /******************** B.04 model *************************************************/ - uint32_t number_su_type; /* size of array saAmfSGtValidSuTypes */ - AVD_SG *list_of_sg; + uint32_t number_su_type {}; /* size of array saAmfSGtValidSuTypes */ + std::vector<AVD_SG*> list_of_sg {}; + private: + AVD_AMF_SG_TYPE(); + void initialize(); + // disallow copy and assign + AVD_AMF_SG_TYPE(const AVD_AMF_SG_TYPE&); + void operator=(const AVD_AMF_SG_TYPE&); -} AVD_AMF_SG_TYPE; +}; extern AmfDb<std::string, AVD_AMF_SG_TYPE> *sgtype_db; SaAisErrorT avd_sgtype_config_get(void); diff --git a/osaf/services/saf/amf/amfd/sg.cc b/osaf/services/saf/amf/amfd/sg.cc --- a/osaf/services/saf/amf/amfd/sg.cc +++ b/osaf/services/saf/amf/amfd/sg.cc @@ -119,7 +119,6 @@ AVD_SG::AVD_SG(): sg_redundancy_model(SA_AMF_NO_REDUNDANCY_MODEL), list_of_su(NULL), list_of_si(NULL), - sg_list_sg_type_next(NULL), sg_type(NULL), sg_list_app_next(NULL), app(NULL), 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 @@ -26,42 +26,27 @@ #include <ntf.h> #include <sgtype.h> #include <proc.h> +#include <algorithm> AmfDb<std::string, AVD_AMF_SG_TYPE> *sgtype_db = NULL; void avd_sgtype_add_sg(AVD_SG *sg) { - sg->sg_list_sg_type_next = sg->sg_type->list_of_sg; - sg->sg_type->list_of_sg = sg; + sg->sg_type->list_of_sg.push_back(sg); } -void avd_sgtype_remove_sg(AVD_SG *sg) -{ - AVD_SG *i_sg = NULL; - AVD_SG *prev_sg = NULL; +void avd_sgtype_remove_sg(AVD_SG *sg) { + AVD_AMF_SG_TYPE *sg_type = sg->sg_type; - if (sg->sg_type != NULL) { - i_sg = sg->sg_type->list_of_sg; - - while ((i_sg != NULL) && (i_sg != sg)) { - prev_sg = i_sg; - i_sg = i_sg->sg_list_sg_type_next; - } - - if (i_sg != sg) { - /* Log a fatal error */ - osafassert(0); - } else { - if (prev_sg == NULL) { - sg->sg_type->list_of_sg = sg->sg_list_sg_type_next; - } else { - prev_sg->sg_list_sg_type_next = sg->sg_list_sg_type_next; - } - } - - sg->sg_list_sg_type_next = NULL; - sg->sg_type = NULL; - } + if (sg_type != nullptr) { + auto pos = std::find(sg_type->list_of_sg.begin(), sg_type->list_of_sg.end(), sg); + if(pos != sg_type->list_of_sg.end()) { + sg_type->list_of_sg.erase(pos); + } else { + /* Log a fatal error */ + osafassert(0); + } + } } static void sgtype_delete(AVD_AMF_SG_TYPE *sg_type) @@ -167,6 +152,12 @@ static int is_config_valid(const SaNameT return 1; } +// +AVD_AMF_SG_TYPE::AVD_AMF_SG_TYPE(const SaNameT *dn) { + memcpy(&name.value, dn->value, dn->length); + name.length = dn->length; +} + /** * Create a new SG type object and initialize its attributes from the attribute list. * @param dn @@ -184,10 +175,7 @@ static AVD_AMF_SG_TYPE *sgtype_create(Sa TRACE_ENTER2("'%s'", dn->value); - sgt = new AVD_AMF_SG_TYPE(); - - memcpy(sgt->name.value, dn->value, dn->length); - sgt->name.length = dn->length; + sgt = new AVD_AMF_SG_TYPE(dn); error = immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSgtRedundancyModel"), attributes, 0, &sgt->saAmfSgtRedundancyModel); osafassert(error == SA_AIS_OK); @@ -354,7 +342,7 @@ static SaAisErrorT sgtype_ccb_completed_ { SaAisErrorT rc = SA_AIS_ERR_BAD_OPERATION; AVD_AMF_SG_TYPE *sgt; - AVD_SG *sg; + bool sg_exist = false; CcbUtilOperationData_t *t_opData; @@ -370,23 +358,18 @@ static SaAisErrorT sgtype_ccb_completed_ break; case CCBUTIL_DELETE: sgt = sgtype_db->find(Amf::to_string(&opdata->objectName)); - if (sgt->list_of_sg != NULL) { - /* check whether there exists a delete operation for - * each of the SG in the sg_type list in the current CCB - */ - sg = sgt->list_of_sg; - while (sg != NULL) { - t_opData = ccbutil_getCcbOpDataByDN(opdata->ccbId, &sg->name); - if ((t_opData == NULL) || (t_opData->operationType != CCBUTIL_DELETE)) { - sg_exist = true; - break; - } - sg = sg->sg_list_sg_type_next; - } - if (sg_exist == true) { - report_ccb_validation_error(opdata, "SGs exist of this SG type '%s'",sgt->name.value); + + for (const auto& sg : sgt->list_of_sg) { + t_opData = ccbutil_getCcbOpDataByDN(opdata->ccbId, &sg->name); + if ((t_opData == NULL) || (t_opData->operationType != CCBUTIL_DELETE)) { + sg_exist = true; + break; + } + } + + if (sg_exist == true) { + report_ccb_validation_error(opdata, "SGs exist of this SG type '%s'",sgt->name.value); goto done; - } } opdata->userData = sgt; /* Save for later use in apply */ rc = SA_AIS_OK; @@ -438,7 +421,8 @@ static void sgtype_ccb_apply_modify_hdlr /* Modify saAmfSGAutoRepair for SGs which had inherited saAmfSgtDefAutoRepair.*/ if (old_value != sgt->saAmfSgtDefAutoRepair) { - for (AVD_SG *sg = sgt->list_of_sg; sg; sg = sg->sg_list_sg_type_next) { + + for (const auto& sg : sgt->list_of_sg) { if (!sg->saAmfSGAutoRepair_configured) { sg->saAmfSGAutoRepair = static_cast<SaBoolT>(sgt->saAmfSgtDefAutoRepair); TRACE("Modified saAmfSGAutoRepair is '%u'", sg->saAmfSGAutoRepair); ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel