osaf/services/saf/amf/amfd/include/node.h |  19 +++++--
 osaf/services/saf/amf/amfd/node.cc        |   5 ++
 osaf/services/saf/amf/amfd/nodegroup.cc   |  73 +++++++++++-------------------
 osaf/services/saf/amf/amfd/sg.cc          |  14 ++---
 osaf/services/saf/amf/amfd/su.cc          |  42 +++++-----------
 5 files changed, 64 insertions(+), 89 deletions(-)


* change saAmfNGNodeList to a std::set
* use std::includes to check for subsets to simplify code

diff --git a/osaf/services/saf/amf/amfd/include/node.h 
b/osaf/services/saf/amf/amfd/include/node.h
--- a/osaf/services/saf/amf/amfd/include/node.h
+++ b/osaf/services/saf/amf/amfd/include/node.h
@@ -42,6 +42,7 @@
 #include <amf_d2nmsg.h>
 #include <timer.h>
 #include <db_template.h>
+#include <set>
 
 class AVD_SU;
 struct avd_cluster_tag;
@@ -147,16 +148,19 @@
 extern AmfDb<uint32_t, AVD_AVND> *node_id_db;
 extern AmfDb<uint32_t, AVD_FAIL_OVER_NODE> *node_list_db;
 
-typedef struct avd_ng_tag {
-
+class AVD_AMF_NG {
+public:
        SaNameT name;
-       uint32_t number_nodes;  /* number of element in saAmfNGNodeList */
-       SaNameT *saAmfNGNodeList;       /* array of node names in group */
+       std::set<std::string> saAmfNGNodeList;
+       
+       /* number of element in saAmfNGNodeList */
+       uint32_t number_nodes() const {
+               return saAmfNGNodeList.size();
+       }
 
        struct avd_ng_tag *cluster_list_ng_next;
        struct avd_cluster_tag *ng_on_cluster;
-
-} AVD_AMF_NG;
+};
 
 #define AVD_AVND_NULL     ((AVD_AVND *)0)
 
@@ -190,6 +194,7 @@
 extern void avd_node_delete(AVD_AVND *avnd);
 extern void avd_node_db_add(AVD_AVND *node);
 extern AVD_AVND *avd_node_get(const SaNameT *node_name);
+extern AVD_AVND *avd_node_get(const std::string& node_name);
 extern AVD_AVND *avd_node_getnext(const SaNameT *node_name);
 extern uint32_t avd_node_add_nodeid(AVD_AVND *avnd);
 extern void avd_node_delete_nodeid(AVD_AVND *node);
@@ -210,7 +215,7 @@
 extern SaAisErrorT avd_ng_config_get(void);
 extern AVD_AMF_NG *avd_ng_get(const SaNameT *dn);
 extern void avd_ng_constructor(void);
-extern bool node_in_nodegroup(const SaNameT *node, const AVD_AMF_NG *ng);
+extern bool node_in_nodegroup(const std::string& node, const AVD_AMF_NG *ng);
 
 /* AMF Node SW Bundle */
 extern void avd_nodeswbundle_constructor(void);
diff --git a/osaf/services/saf/amf/amfd/node.cc 
b/osaf/services/saf/amf/amfd/node.cc
--- a/osaf/services/saf/amf/amfd/node.cc
+++ b/osaf/services/saf/amf/amfd/node.cc
@@ -139,6 +139,11 @@
        return node_name_db->find(Amf::to_string(dn));
 }
 
+AVD_AVND *avd_node_get(const std::string& dn)
+{
+       return node_name_db->find(dn);
+}
+
 AVD_AVND *avd_node_find_nodeid(SaClmNodeIdT node_id)
 {
        return node_id_db->find(node_id);
diff --git a/osaf/services/saf/amf/amfd/nodegroup.cc 
b/osaf/services/saf/amf/amfd/nodegroup.cc
--- a/osaf/services/saf/amf/amfd/nodegroup.cc
+++ b/osaf/services/saf/amf/amfd/nodegroup.cc
@@ -22,6 +22,7 @@
 #include <amfd.h>
 #include <cluster.h>
 #include <imm.h>
+#include <set>
 
 AmfDb<std::string, AVD_AMF_NG> *nodegroup_db = 0;
 
@@ -113,11 +114,10 @@
        if 
((immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("saAmfNGNodeList"), 
attributes,
                &values_number) == SA_AIS_OK) && (values_number > 0)) {
 
-               ng->number_nodes = values_number;
-               ng->saAmfNGNodeList = 
static_cast<SaNameT*>(malloc(values_number * sizeof(SaNameT)));
                for (i = 0; i < values_number; i++) {
-                       if ((node_name = immutil_getNameAttr(attributes, 
"saAmfNGNodeList", i)) != NULL)
-                               ng->saAmfNGNodeList[i] = *node_name;
+                       if ((node_name = immutil_getNameAttr(attributes, 
"saAmfNGNodeList", i)) != NULL) {
+                               
ng->saAmfNGNodeList.insert(Amf::to_string(node_name));
+                       }
                }
        }
        else {
@@ -143,7 +143,6 @@
 static void ng_delete(AVD_AMF_NG *ng)
 {
        nodegroup_db->erase(Amf::to_string(&ng->name));
-       free(ng->saAmfNGNodeList);
        delete ng;
 }
 
@@ -234,14 +233,14 @@
  * 
  * @return true if found, otherwise false
  */
-bool node_in_nodegroup(const SaNameT *node, const AVD_AMF_NG *ng)
+bool node_in_nodegroup(const std::string& node, const AVD_AMF_NG *ng)
 {
-       for (unsigned int i = 0; i < ng->number_nodes; i++) {
-               if ((ng->saAmfNGNodeList[i].length == node->length) &&
-                       memcmp(&ng->saAmfNGNodeList[i].value, node->value, 
node->length) == 0)
-                       return true;
-       }
-       
+       std::set<std::string>::const_iterator iter;
+
+       iter = ng->saAmfNGNodeList.find(node);
+       if (iter != ng->saAmfNGNodeList.end())
+               return true;
+
        return false;
 }
 
@@ -292,7 +291,8 @@
 
                                TRACE("DEL %s", ((SaNameT 
*)mod->modAttr.attrValues[j])->value);
 
-                               if (node_in_nodegroup((SaNameT 
*)mod->modAttr.attrValues[j], ng) == false) {
+                               if (node_in_nodegroup(Amf::to_string((SaNameT 
*)mod->modAttr.attrValues[j]),
+                                               ng) == false) {
                                        report_ccb_validation_error(opdata, "ng 
modify: node '%s' does not exist in node group",
                                                ((SaNameT 
*)mod->modAttr.attrValues[j])->value);
                                        goto done;
@@ -390,14 +390,16 @@
        AVD_SU *su;
        AVD_AVND *node;
        AVD_AMF_NG *ng = avd_ng_get(&opdata->objectName);
-       unsigned int i;
 
-       TRACE_ENTER2("%u", ng->number_nodes);
+       TRACE_ENTER2("%u", ng->number_nodes());
+       std::set<std::string>::const_iterator iter;
 
-       /* for all nodes in node group */
-       for (i = 0; i < ng->number_nodes; i++) {
-               node = avd_node_get(&ng->saAmfNGNodeList[i]);
+       for (iter = ng->saAmfNGNodeList.begin();
+               iter != ng->saAmfNGNodeList.end();
+               ++iter) {
 
+               node = avd_node_get(*iter);
+               
                TRACE("%s", node->name.value);
 
                /*
@@ -410,7 +412,7 @@
 
                for (su = node->list_of_ncs_su; su; su = su->avnd_list_su_next) 
{
                        if (su_is_mapped_to_node_via_nodegroup(su, ng) &&
-                           is_deleted_in_ccb(opdata->ccbId, &su->name) == 
false) {
+                               is_deleted_in_ccb(opdata->ccbId, &su->name) == 
false) {
                                report_ccb_validation_error(opdata, "Cannot 
delete '%s' because '%s' is mapped using it",
                                        ng->name.value, su->name.value);
                                goto done;
@@ -419,7 +421,7 @@
 
                for (su = node->list_of_su; su; su = su->avnd_list_su_next) {
                        if (su_is_mapped_to_node_via_nodegroup(su, ng) &&
-                           is_deleted_in_ccb(opdata->ccbId, &su->name) == 
false) {
+                               is_deleted_in_ccb(opdata->ccbId, &su->name) == 
false) {
                                report_ccb_validation_error(opdata, "Cannot 
delete '%s' because '%s' is mapped using it",
                                        ng->name.value, su->name.value);
                                goto done;
@@ -482,39 +484,18 @@
        while ((mod = opdata->param.modify.attrMods[i++]) != NULL) {
                switch (mod->modType) {
                case SA_IMM_ATTR_VALUES_ADD: {
-                       ng->saAmfNGNodeList = 
static_cast<SaNameT*>(realloc(ng->saAmfNGNodeList,
-                                                                   
(ng->number_nodes + mod->modAttr.attrValuesNumber) * sizeof(SaNameT)));
-
-                       if (ng->saAmfNGNodeList == NULL) {
-                               LOG_EM("%s: realloc FAILED", __FUNCTION__);
-                               exit(1);
+                       for (j = 0; j < mod->modAttr.attrValuesNumber; j++) {
+                               
ng->saAmfNGNodeList.insert(Amf::to_string((SaNameT*)mod->modAttr.attrValues[j]));
                        }
 
-                       for (j = 0; j < mod->modAttr.attrValuesNumber; j++) {
-                               ng->saAmfNGNodeList[ng->number_nodes + j] = 
*((SaNameT *)mod->modAttr.attrValues[j]);
-                               TRACE("ADD %s", 
ng->saAmfNGNodeList[ng->number_nodes + j].value);
-                       }
-
-                       ng->number_nodes += mod->modAttr.attrValuesNumber;
-                       TRACE("number_nodes %u", ng->number_nodes);
+                       TRACE("number_nodes %u", ng->number_nodes());
                        break;
                }
                case SA_IMM_ATTR_VALUES_DELETE: {
                        /* find node to delete */
-                       for (j = 0; j < ng->number_nodes; j++) {
-                               if (memcmp(&ng->saAmfNGNodeList[j], 
mod->modAttr.attrValues[0], sizeof(SaNameT)) == 0)
-                                       break;
-                       }
+                       
ng->saAmfNGNodeList.erase(Amf::to_string((SaNameT*)mod->modAttr.attrValues[j]));
 
-                       osafassert(j < ng->number_nodes);
-
-                       TRACE("found node %s", ng->saAmfNGNodeList[j].value);
-
-                       for (; j < (ng->number_nodes - 1); j++)
-                               ng->saAmfNGNodeList[j] = ng->saAmfNGNodeList[j 
+ 1];
-
-                       ng->number_nodes -= mod->modAttr.attrValuesNumber;
-                       TRACE("number_nodes %u", ng->number_nodes);
+                       TRACE("number_nodes %u", ng->number_nodes());
                        break;
                }
                default:
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
@@ -29,6 +29,7 @@
 #include <proc.h>
 #include <si_dep.h>
 #include <csi.h>
+#include <algorithm>
 
 AmfDb<std::string, AVD_SG> *sg_db = NULL;
 
@@ -491,19 +492,16 @@
 static bool ng_is_subset(const SaNameT *ngname, const AVD_AMF_NG *superng)
 {
        const AVD_AMF_NG *ng = avd_ng_get(ngname);
-       const SaNameT *nodename;
 
-       if (superng->number_nodes < ng->number_nodes)
+       if (superng->number_nodes() < ng->number_nodes())
                return false;
 
-       for (unsigned i = 0; i < ng->number_nodes; i++) {
-               nodename = &ng->saAmfNGNodeList[i];
-
-               if (node_in_nodegroup(nodename, superng) == false)
-                       return false;
+       if (std::includes(superng->saAmfNGNodeList.begin(), 
superng->saAmfNGNodeList.end(),
+               ng->saAmfNGNodeList.begin(), ng->saAmfNGNodeList.end()) == 
true) {
+               return true;
        }
 
-       return true;
+       return false;
 }
 
 /**
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
@@ -29,6 +29,7 @@
 #include <proc.h>
 #include <csi.h>
 #include <cluster.h>
+#include <algorithm>
 
 AmfDb<std::string, AVD_SU> *su_db = NULL;
 
@@ -354,10 +355,6 @@
        if ((strstr((char *)saAmfSUHostNodeOrNodeGroup.value, 
"safAmfNodeGroup=") != NULL) &&
            (strstr((char *)saAmfSGSuHostNodeGroup.value, "safAmfNodeGroup=") 
!= NULL)) {
                AVD_AMF_NG *ng_of_su, *ng_of_sg;
-               SaNameT *ng_node_list_su, *ng_node_list_sg;
-               unsigned int i;
-               unsigned int j;
-               int found;
 
                ng_of_su = avd_ng_get(&saAmfSUHostNodeOrNodeGroup);
                if (ng_of_su == NULL) {
@@ -373,35 +370,21 @@
                        return 0;
                }
 
-               if (ng_of_su->number_nodes > ng_of_sg->number_nodes) {
+               if (ng_of_su->number_nodes() > ng_of_sg->number_nodes()) {
                        report_ccb_validation_error(opdata, 
                                        "SU node group '%s' contains more nodes 
than the SG node group '%s'",
                                        saAmfSUHostNodeOrNodeGroup.value, 
saAmfSGSuHostNodeGroup.value);
                        return 0;
                }
 
-               ng_node_list_su = ng_of_su->saAmfNGNodeList;
-
-               for (i = 0; i < ng_of_su->number_nodes; i++) {
-                       found = 0;
-                       ng_node_list_sg = ng_of_sg->saAmfNGNodeList;
-
-                       for (j = 0; j < ng_of_sg->number_nodes; j++) {
-                               if (!memcmp(ng_node_list_su, ng_node_list_sg, 
sizeof(SaNameT)))
-                                       found = 1;
-
-                               ng_node_list_sg++;
-                       }
-
-                       if (!found) {
-                               report_ccb_validation_error(opdata, 
+               if (std::includes(ng_of_sg->saAmfNGNodeList.begin(), 
ng_of_sg->saAmfNGNodeList.end(),
+                       ng_of_su->saAmfNGNodeList.begin(), 
ng_of_su->saAmfNGNodeList.end()) == false) {
+                       report_ccb_validation_error(opdata, 
                                                "SU node group '%s' is not a 
subset of the SG node group '%s'",
                                                
saAmfSUHostNodeOrNodeGroup.value, saAmfSGSuHostNodeGroup.value);
-                               return 0;
-                       }
 
-                       ng_node_list_su++;
-               }
+                       return 0;
+               }               
        }
 
        // TODO maintenance campaign
@@ -504,9 +487,9 @@
 static AVD_AVND *map_su_to_node(AVD_SU *su)
 {
        AVD_AMF_NG *ng = NULL;
-       unsigned int i;          
        AVD_SU *su_temp = NULL;
        AVD_AVND *node = NULL;
+       std::set<std::string>::const_iterator node_iter;
 
        TRACE_ENTER2("'%s'", su->name.value);
 
@@ -527,8 +510,11 @@
        osafassert(ng);
 
        /* Find a node in the group that doesn't have a SU in same SG mapped to 
it already */
-       for (i = 0; i < ng->number_nodes; i++) {
-               node = avd_node_get(&ng->saAmfNGNodeList[i]);
+       for (node_iter = ng->saAmfNGNodeList.begin();
+               node_iter != ng->saAmfNGNodeList.end();
+               node_iter++) {
+
+               node = avd_node_get(*node_iter);
                osafassert(node);
 
                if (su->sg_of_su->sg_ncs_spec == true) {
@@ -550,7 +536,7 @@
        }
 
        /* All nodes already have an SU mapped for the SG. Return a node in the 
node group. */
-       node = avd_node_get(&ng->saAmfNGNodeList[0]);
+       node = avd_node_get(*ng->saAmfNGNodeList.begin());
 done:
        memcpy(&su->saAmfSUHostedByNode, &node->name, sizeof(SaNameT));
        TRACE_LEAVE2("hosted by %s", node->name.value);

------------------------------------------------------------------------------
Dive into the World of Parallel Programming. The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to