osaf/services/saf/amf/amfd/app.cc | 40 +++++++++++++++++++------------ osaf/services/saf/amf/amfd/ckpt_enc.cc | 2 +- osaf/services/saf/amf/amfd/ckpt_updt.cc | 2 +- osaf/services/saf/amf/amfd/include/app.h | 23 +++++++++++++++--- osaf/services/saf/amf/amfd/sg.cc | 2 +- osaf/services/saf/amf/amfd/si.cc | 2 +- osaf/services/saf/amf/amfd/util.cc | 4 +- 7 files changed, 49 insertions(+), 26 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,24 +24,33 @@ #include <imm.h> #include <si.h> -// A map with application instances, key is DN as std:string -AmfAppMap *AmfAppDb::db; +AmfAppDb* AmfAppDb::instance = 0; +pthread_once_t AmfAppDb::control = PTHREAD_ONCE_INIT; + +void AmfAppDb::init() { + instance = new AmfAppDb; +} + +AmfAppDb* AmfAppDb::get_instance() { + pthread_once(&control, init); + return instance; +} void AmfAppDb::insert(AVD_APP *app) { std::string name((const char*)app->name.value, app->name.length); - (*db)[name] = app; + db[name] = app; } void AmfAppDb::erase(AVD_APP *app) { std::string name((const char*)app->name.value, app->name.length); - AmfAppMap::iterator it = db->find(name); - db->erase(it); + AmfAppMap::iterator it = db.find(name); + db.erase(it); } AVD_APP *AmfAppDb::find(const SaNameT *dn) { std::string name((const char*)dn->value, dn->length); - AmfAppMap::iterator it = db->find(name); - if (it == db->end()) + AmfAppMap::iterator it = db.find(name); + if (it == db.end()) return NULL; else return it->second; @@ -59,7 +68,7 @@ static AVD_APP *avd_app_new(const SaName // TODO(hafe) change this to a destructor static void avd_app_delete(AVD_APP *app) { - AmfAppDb::erase(app); + AmfAppDb::get_instance()->erase(app); m_AVSV_SEND_CKPT_UPDT_ASYNC_RMV(avd_cb, app, AVSV_CKPT_AVD_APP_CONFIG); avd_apptype_remove_app(app); delete app; @@ -75,8 +84,8 @@ static void app_add_to_model(AVD_APP *ap goto done; } - if (AmfAppDb::find(&app->name) == NULL) { - AmfAppDb::insert(app); + if (AmfAppDb::get_instance()->find(&app->name) == NULL) { + AmfAppDb::get_instance()->insert(app); } /* Find application type and make a link with app type */ @@ -219,7 +228,7 @@ AVD_APP *avd_app_create(const SaNameT *d ** If called at new active at failover, the object is found in the DB ** but needs to get configuration attributes initialized. */ - app = AmfAppDb::find(dn); + app = AmfAppDb::get_instance()->find(dn); if (app == NULL) { if ((app = avd_app_new(dn)) == NULL) goto done; @@ -305,7 +314,7 @@ static void app_ccb_apply_cb(CcbUtilOper break; case CCBUTIL_MODIFY: { const SaImmAttrModificationT_2 *attr_mod; - app = AmfAppDb::find(&opdata->objectName); + app = AmfAppDb::get_instance()->find(&opdata->objectName); while ((attr_mod = opdata->param.modify.attrMods[i++]) != NULL) { const SaImmAttrValuesT_2 *attribute = &attr_mod->modAttr; @@ -325,7 +334,7 @@ static void app_ccb_apply_cb(CcbUtilOper break; } case CCBUTIL_DELETE: - app = AmfAppDb::find(&opdata->objectName); + app = AmfAppDb::get_instance()->find(&opdata->objectName); /* by this time all the SGs and SIs under this * app object should have been *DELETED* just * do a sanity check here @@ -350,7 +359,7 @@ static void app_admin_op_cb(SaImmOiHandl TRACE_ENTER2("%s", object_name->value); /* Find the app name. */ - app = AmfAppDb::find(object_name); + app = AmfAppDb::get_instance()->find(object_name); osafassert(app != NULL); if (op_id == SA_AMF_ADMIN_UNLOCK) { @@ -407,7 +416,7 @@ done: static SaAisErrorT app_rt_attr_cb(SaImmOiHandleT immOiHandle, const SaNameT *objectName, const SaImmAttrNameT *attributeNames) { - AVD_APP *app = AmfAppDb::find(objectName); + AVD_APP *app = AmfAppDb::get_instance()->find(objectName); SaImmAttrNameT attributeName; int i = 0; @@ -484,7 +493,6 @@ SaAisErrorT avd_app_config_get(void) void avd_app_constructor(void) { - AmfAppDb::db = new AmfAppMap; avd_class_impl_set(const_cast<SaImmClassNameT>("SaAmfApplication"), app_rt_attr_cb, app_admin_op_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 @@ -2247,7 +2247,7 @@ static uint32_t enc_cs_app_config(AVD_CL TRACE_ENTER(); /* Walk through all application instances and encode. */ - for (AmfAppMap::iterator it = AmfAppDb::db->begin(); it != AmfAppDb::db->end(); it++) { + for (AmfAppMap::iterator it = AmfAppDb::get_instance()->get_app_db().begin(); it != AmfAppDb::get_instance()->get_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); diff --git a/osaf/services/saf/amf/amfd/ckpt_updt.cc b/osaf/services/saf/amf/amfd/ckpt_updt.cc --- a/osaf/services/saf/amf/amfd/ckpt_updt.cc +++ b/osaf/services/saf/amf/amfd/ckpt_updt.cc @@ -101,7 +101,7 @@ uint32_t avd_ckpt_app(AVD_CL_CB *cb, AVD osafassert (action == NCS_MBCSV_ACT_UPDATE); - AVD_APP *app = AmfAppDb::find(&ckpt_app->name); + AVD_APP *app = AmfAppDb::get_instance()->find(&ckpt_app->name); if (app == NULL) { LOG_ER("%s failed to find '%s'", __FUNCTION__, ckpt_app->name.value); rc = NCSCC_RC_FAILURE; 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 @@ -63,10 +63,25 @@ typedef std::map<std::string, AVD_APP*> class AmfAppDb { public: - static AmfAppMap *db; - static void insert(AVD_APP *app); - static void erase(AVD_APP *app); - static AVD_APP *find(const SaNameT *name); + static AmfAppDb* get_instance(); + void insert(AVD_APP *app); + void erase(AVD_APP *app); + AVD_APP *find(const SaNameT *name); + AmfAppMap& get_app_db() {return db;} + + private: + AmfAppDb() {} + AmfAppDb(const AmfAppDb&) {} + AmfAppDb& operator= (const AmfAppDb&); + + static AmfAppDb* instance; + // one example of making singleton thread safe, double checked locking does not work, + // c++11 static initializer and google c++ style guides? __attribute__((constructor)) init(); + // There are several other ways to make the singleton thread safe though. But use pthread_once for now. + static pthread_once_t control; + static void init(); + + AmfAppMap db; }; extern void avd_app_add_si(AVD_APP *app, struct avd_si_tag *si); 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 @@ -66,7 +66,7 @@ static void sg_add_to_model(AVD_SG *sg) } avsv_sanamet_init(&sg->name, &dn, "safApp"); - sg->app = AmfAppDb::find(&dn); + sg->app = AmfAppDb::get_instance()->find(&dn); avd_sg_db_add(sg); sg->sg_type = avd_sgtype_get(&sg->saAmfSGType); diff --git a/osaf/services/saf/amf/amfd/si.cc b/osaf/services/saf/amf/amfd/si.cc --- a/osaf/services/saf/amf/amfd/si.cc +++ b/osaf/services/saf/amf/amfd/si.cc @@ -450,7 +450,7 @@ static void si_add_to_model(AVD_SI *si) } avsv_sanamet_init(&si->name, &dn, "safApp"); - si->app = AmfAppDb::find(&dn); + si->app = AmfAppDb::get_instance()->find(&dn); avd_si_db_add(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 @@ -1423,8 +1423,8 @@ void amfd_file_dump(const char *path) node_id = node->node_info.nodeId; } - for (AmfAppMap::iterator it = AmfAppDb::db->begin(); - it != AmfAppDb::db->end(); it++) { + for (AmfAppMap::iterator it = AmfAppDb::get_instance()->get_app_db().begin(); + it != AmfAppDb::get_instance()->get_app_db().end(); it++) { const AVD_APP *app = it->second; fprintf(f, "%s\n", app->name.value); fprintf(f, "\tsaAmfApplicationAdminState=%u\n", app->saAmfApplicationAdminState); ------------------------------------------------------------------------------ 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