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

Reply via email to