osaf/services/saf/amf/amfd/app.cc        |  72 ++++++++++++-------------------
 osaf/services/saf/amf/amfd/ckpt_enc.cc   |  12 +---
 osaf/services/saf/amf/amfd/include/app.h |  13 +++--
 osaf/services/saf/amf/amfd/util.cc       |  15 +++---
 4 files changed, 47 insertions(+), 65 deletions(-)


diff --git a/osaf/services/saf/amf/amfd/app.cc 
b/osaf/services/saf/amf/amfd/app.cc
--- a/osaf/services/saf/amf/amfd/app.cc
+++ b/osaf/services/saf/amf/amfd/app.cc
@@ -24,35 +24,25 @@
 #include <imm.h>
 #include <si.h>
 
-static NCS_PATRICIA_TREE app_db;
+// A map with application instances, key is DN as std:string
+ApplicationMap *g_app_db;
 
-void avd_app_db_add(AVD_APP *app)
+// TODO(hafe) change this to a constructor
+static AVD_APP *avd_app_new(const SaNameT *dn)
 {
-       unsigned int rc;
-
-       if (avd_app_get(&app->name) == NULL) {
-               rc = ncs_patricia_tree_add(&app_db, &app->tree_node);
-               osafassert(rc == NCSCC_RC_SUCCESS);
-       }
-}
-
-AVD_APP *avd_app_new(const SaNameT *dn)
-{
-       AVD_APP *app;
-
-       app = new AVD_APP();
-
+       AVD_APP *app = new AVD_APP();
        memcpy(app->name.value, dn->value, dn->length);
        app->name.length = dn->length;
-       app->tree_node.key_info = (uint8_t *)&(app->name);
-
        return app;
 }
 
-void avd_app_delete(AVD_APP *app)
+// TODO(hafe) change this to a destructor
+static void avd_app_delete(AVD_APP *app)
 {
-       unsigned int rc = ncs_patricia_tree_del(&app_db, &app->tree_node);
-       osafassert(rc == NCSCC_RC_SUCCESS);
+       std::string name((const char*)app->name.value, app->name.length);
+       ApplicationMap::iterator it = g_app_db->find(name);
+       g_app_db->erase(it);
+
        m_AVSV_SEND_CKPT_UPDT_ASYNC_RMV(avd_cb, app, AVSV_CKPT_AVD_APP_CONFIG);
        avd_apptype_remove_app(app);
        delete app;
@@ -60,22 +50,13 @@ void avd_app_delete(AVD_APP *app)
 
 AVD_APP *avd_app_get(const SaNameT *dn)
 {
-       SaNameT tmp = {0};
+       std::string name((const char*)dn->value, dn->length);
+       ApplicationMap::iterator it = g_app_db->find(name);
 
-       tmp.length = dn->length;
-       memcpy(tmp.value, dn->value, tmp.length);
-
-       return (AVD_APP *)ncs_patricia_tree_get(&app_db, (uint8_t *)&tmp);
-}
-
-AVD_APP *avd_app_getnext(const SaNameT *dn)
-{
-       SaNameT tmp = {0};
-
-       tmp.length = dn->length;
-       memcpy(tmp.value, dn->value, tmp.length);
-
-       return (AVD_APP *)ncs_patricia_tree_getnext(&app_db, (uint8_t *)&tmp);
+       if (it == g_app_db->end())
+               return NULL;
+       else
+               return it->second;
 }
 
 static void app_add_to_model(AVD_APP *app)
@@ -88,7 +69,11 @@ static void app_add_to_model(AVD_APP *ap
                goto done;
        }
 
-       avd_app_db_add(app);
+       if (avd_app_get(&app->name) == NULL) {
+               std::string name((const char*)app->name.value, 
app->name.length);
+               (*g_app_db)[name] = app;
+       }
+
        /* Find application type and make a link with app type */
        app->app_type = avd_apptype_get(&app->saAmfAppType);
        osafassert(app->app_type);
@@ -493,12 +478,11 @@ SaAisErrorT avd_app_config_get(void)
 
 void avd_app_constructor(void)
 {
-       NCS_PATRICIA_PARAMS patricia_params;
+       g_app_db = new ApplicationMap;
 
-       patricia_params.key_size = sizeof(SaNameT);
-       osafassert(ncs_patricia_tree_init(&app_db, &patricia_params) == 
NCSCC_RC_SUCCESS);
-
-       avd_class_impl_set(const_cast<SaImmClassNameT>("SaAmfApplication"), 
app_rt_attr_cb, app_admin_op_cb,
-               app_ccb_completed_cb, app_ccb_apply_cb);
+       avd_class_impl_set(const_cast<SaImmClassNameT>("SaAmfApplication"),
+                                               app_rt_attr_cb,
+                                               app_admin_op_cb,
+                                               app_ccb_completed_cb,
+                                               app_ccb_apply_cb);
 }
-
diff --git a/osaf/services/saf/amf/amfd/ckpt_enc.cc 
b/osaf/services/saf/amf/amfd/ckpt_enc.cc
--- a/osaf/services/saf/amf/amfd/ckpt_enc.cc
+++ b/osaf/services/saf/amf/amfd/ckpt_enc.cc
@@ -2243,16 +2243,13 @@ static uint32_t enc_cs_node_config(AVD_C
 static uint32_t enc_cs_app_config(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc, 
uint32_t *num_of_obj)
 {
        uint32_t status = NCSCC_RC_SUCCESS;
-       SaNameT app_name;
-       AVD_APP *app;
        EDU_ERR ederror = static_cast<EDU_ERR>(0);
        TRACE_ENTER();
 
-       /* 
-        * Walk through the entire list and send the entire list data.
-        */
-       app_name.length = 0;
-       for (app = avd_app_getnext(&app_name); app != NULL; app = 
avd_app_getnext(&app_name)) {
+       /* Walk through all application instances and encode. */
+       ApplicationMap::iterator it;
+       for (it = g_app_db->begin(); it != g_app_db->end(); it++) {
+               AVD_APP *app = it->second;
                status = m_NCS_EDU_VER_EXEC(&cb->edu_hdl, 
avsv_edp_ckpt_msg_app, &enc->io_uba,
                                            EDP_OP_TYPE_ENC, app, &ederror, 
enc->i_peer_version);
 
@@ -2261,7 +2258,6 @@ static uint32_t enc_cs_app_config(AVD_CL
                        return NCSCC_RC_FAILURE;
                }
 
-               app_name = app->name;
                (*num_of_obj)++;
        }
 
diff --git a/osaf/services/saf/amf/amfd/include/app.h 
b/osaf/services/saf/amf/amfd/include/app.h
--- a/osaf/services/saf/amf/amfd/include/app.h
+++ b/osaf/services/saf/amf/amfd/include/app.h
@@ -24,8 +24,13 @@
 #ifndef AVD_APP_H
 #define AVD_APP_H
 
+#include <map>
+#include <string>
+
 #include <saAmf.h>
 #include <saImm.h>
+
+// TODO(hafe) remove include below when apptype is using map
 #include <ncspatricia.h>
 #include <sg.h>
 #include <si.h>
@@ -43,7 +48,6 @@ typedef struct avd_app_type_tag {
 } AVD_APP_TYPE;
 
 typedef struct avd_app_tag {
-       NCS_PATRICIA_NODE tree_node;    /* key is name */
        SaNameT name;
        SaNameT saAmfAppType;
        SaAmfAdminStateT saAmfApplicationAdminState;
@@ -54,11 +58,10 @@ typedef struct avd_app_tag {
        struct avd_app_type_tag *app_type;
 } AVD_APP;
 
-extern void avd_app_db_add(AVD_APP *app);
-extern AVD_APP *avd_app_new(const SaNameT *dn);
-extern void avd_app_delete(AVD_APP *app);
+typedef std::map<std::string, AVD_APP*> ApplicationMap;
+extern ApplicationMap *g_app_db;
+
 extern AVD_APP *avd_app_get(const SaNameT *app_name);
-extern AVD_APP *avd_app_getnext(const SaNameT *app_name);
 
 extern void avd_app_add_si(AVD_APP *app, struct avd_si_tag *si);
 extern void avd_app_remove_si(AVD_APP *app, struct avd_si_tag *si);
diff --git a/osaf/services/saf/amf/amfd/util.cc 
b/osaf/services/saf/amf/amfd/util.cc
--- a/osaf/services/saf/amf/amfd/util.cc
+++ b/osaf/services/saf/amf/amfd/util.cc
@@ -1391,13 +1391,14 @@ void avsv_sanamet_init_from_association_
 }
 
 /**
- * Call this function from GDB to dump the AVD state. Example 
- * below.
+ * Dumps the director state to file
+ * This can be done using GDB:
+ * $ gdb --pid=`pgrep osafamfd` -ex 'call 
amfd_file_dump("/tmp/osafamfd.dump")' \
+ *             /usr/local/lib/opensaf/osafamfd
  * 
  * @param path 
  */
-/* gdb --pid=`pgrep ncs_scap` -ex 'call        avd_file_dump("/tmp/avd.dump")' 
/usr/local/lib/opensaf/ncs_scap */
-void avd_file_dump(const char *path)
+void amfd_file_dump(const char *path)
 {
        SaNameT dn = {0};
        FILE *f = fopen(path, "w");
@@ -1422,13 +1423,11 @@ void avd_file_dump(const char *path)
                node_id = node->node_info.nodeId;
        }
 
-       AVD_APP *app;
-       dn.length = 0;
-       for (app = avd_app_getnext(&dn); app != NULL; app = 
avd_app_getnext(&dn)) {
+       for (ApplicationMap::iterator it = g_app_db->begin(); it != 
g_app_db->end(); it++) {
+               const AVD_APP *app = it->second;
                fprintf(f, "%s\n", app->name.value);
                fprintf(f, "\tsaAmfApplicationAdminState=%u\n", 
app->saAmfApplicationAdminState);
                fprintf(f, "\tsaAmfApplicationCurrNumSGs=%u\n", 
app->saAmfApplicationCurrNumSGs);
-               dn = app->name;
        }
 
        AVD_SG *sg;

------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today. 
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to