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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel