]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/material/makeEffect.cxx
Work around apparent OSG 3.2.0 normal binding bug.
[simgear.git] / simgear / scene / material / makeEffect.cxx
index 477328ff495daf649680573c2218cdb249870582..4abdd4a2da2034e598933ad52453c0234b7669e6 100644 (file)
@@ -122,7 +122,8 @@ Effect* makeEffect(const string& name,
     {
         OpenThreads::ScopedLock<OpenThreads::ReentrantMutex> lock(effectMutex);
         EffectMap::iterator itr = effectMap.find(name);
-        if (itr != effectMap.end())
+        if ((itr != effectMap.end())&&
+            itr->second.valid())
             return itr->second.get();
     }
     string effectFileName(name);
@@ -205,8 +206,9 @@ Effect* makeEffect(SGPropertyNode* prop,
                     lock(effectMutex);
                 cache = parent->getCache();
                 itr = cache->find(key);
-                if (itr != cache->end()) {
-                    effect = itr->second.get();
+                if ((itr != cache->end())&&
+                    itr->second.lock(effect))
+                {
                     effect->generator = parent->generator;  // Copy the generators
                 }
             }
@@ -219,8 +221,13 @@ Effect* makeEffect(SGPropertyNode* prop,
                     lock(effectMutex);
                 pair<Effect::Cache::iterator, bool> irslt
                     = cache->insert(make_pair(key, effect));
-                if (!irslt.second)
-                    effect = irslt.first->second;
+                if (!irslt.second) {
+                    ref_ptr<Effect> old;
+                    if (irslt.first->second.lock(old))
+                        effect = old; // Another thread beat us in creating it! Discard our own...
+                    else
+                        irslt.first->second = effect; // update existing, but empty observer
+                }
                 effect->generator = parent->generator;  // Copy the generators
             }
         } else {
@@ -263,4 +270,10 @@ Effect* makeEffect(SGPropertyNode* prop,
     return effect.release();
 }
 
+void clearEffectCache()
+{
+    OpenThreads::ScopedLock<OpenThreads::ReentrantMutex> lock(effectMutex);
+    effectMap.clear();
+}
+
 }