Browse Source

HPCC-11777 Fix CLocalEnvironment cache thread safeness

Signed-off-by: Jake Smith <jake.smith@lexisnexis.com>
Jake Smith 11 years ago
parent
commit
16277f20af
1 changed files with 11 additions and 1 deletions
  1. 11 1
      common/environment/environment.cpp

+ 11 - 1
common/environment/environment.cpp

@@ -888,6 +888,7 @@ IEnvironment& CLocalEnvironment::lock() const
 
 IStringVal & CLocalEnvironment::getName(IStringVal & str) const
 {
+    synchronized procedure(safeCache);
     str.set(p->queryProp("@name"));
     return str;
 }
@@ -895,13 +896,17 @@ IStringVal & CLocalEnvironment::getName(IStringVal & str) const
 IStringVal & CLocalEnvironment::getXML(IStringVal & str) const
 {
     StringBuffer xml;
-    toXML(p->queryBranch("."), xml);
+    {
+        synchronized procedure(safeCache);
+        toXML(p->queryBranch("."), xml);
+    }
     str.set(xml.str());
     return str;
 }
 
 IPropertyTree & CLocalEnvironment::getPTree() const
 {
+    synchronized procedure(safeCache);
     return *LINK(p);
 }
 
@@ -1059,6 +1064,7 @@ IConstInstanceInfo * CLocalEnvironment::getInstance(const char *type, const char
         xpath.append("[@version='").append(version).append("']");
     xpath.append("/Instance");
 
+    synchronized procedure(safeCache);
     Owned<IPropertyTreeIterator> _it = p->getElements(xpath);
     for (_it->first(); _it->isValid(); _it->next())
     {
@@ -1090,6 +1096,7 @@ CConstInstanceInfo * CLocalEnvironment::getInstanceByIP(const char *type, const
         xpath.append("[@version='").append(version).append("']");
     xpath.append("/Instance");
 
+    synchronized procedure(safeCache);
     assertex(p);
     Owned<IPropertyTreeIterator> _it = p->getElements(xpath);
     assertex(_it);
@@ -1120,6 +1127,7 @@ void CLocalEnvironment::unlockRemote()
 #else
    if (conn)
    {
+       synchronized procedure(safeCache);
        p.clear();
        conn.setown(querySDS().connect(xPath.str(), myProcessSession(), 0, SDS_LOCK_TIMEOUT));
        p.setown(conn->getRoot());
@@ -1129,12 +1137,14 @@ void CLocalEnvironment::unlockRemote()
 
 void CLocalEnvironment::preload()
 {
+    synchronized procedure(safeCache);
     p->queryBranch(".");
 }
 
 void CLocalEnvironment::setXML(const char *xml)
 {
     Owned<IPropertyTree> newRoot = createPTreeFromXMLString(xml);
+    synchronized procedure(safeCache);
     Owned<IPropertyTreeIterator> it = p->getElements("*");
     ForEach(*it)
     {