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