as and alternative to use a global g_app_db you can use a class, e.g.: h file: class AmfApplicationDb { public: static ApplicationMap application_map_db; static void add(AmfApplication* application);
: }; cc file: ApplicationMap AmfApplicationDb::application_map_db; void AmfApplicationDb::add(AmfApplication* application) { application_map_db[application->get_name()] = application; } etc. /BR HansN On 01/14/14 15:17, Hans Feldt wrote: > 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