Add "no trash" CDMap elements, so that CDMap elements can themselves
authorMorgan Deters <mdeters@gmail.com>
Tue, 17 Aug 2010 05:06:09 +0000 (05:06 +0000)
committerMorgan Deters <mdeters@gmail.com>
Tue, 17 Aug 2010 05:06:09 +0000 (05:06 +0000)
be allocated in context memory.  CDMap black-box test extended.

src/context/cdmap.h
test/unit/context/cdmap_black.h

index 66f897818c7e3a9f4a34da99fb098d3e2e9eea56..c218d05f3beeb065930bdedb34c2e770d5774098 100644 (file)
@@ -329,7 +329,9 @@ public:
         ++i) {
       // mark it as being a destruction (short-circuit restore())
       (*i).second->d_map = NULL;
-      (*i).second->deleteSelf();
+      if(!(*i).second->d_noTrash) {
+        (*i).second->deleteSelf();
+      }
     }
     d_map.clear();
     d_first = NULL;
@@ -349,7 +351,9 @@ public:
         ++i) {
       // mark it as being a destruction (short-circuit restore())
       (*i).second->d_map = NULL;
-      (*i).second->deleteSelf();
+      if(!(*i).second->d_noTrash) {
+        (*i).second->deleteSelf();
+      }
     }
     d_map.clear();
     d_first = NULL;
@@ -486,7 +490,9 @@ public:
         d_map.erase(j);//FIXME multithreading
         Debug("gc") << "key " << k << " obliterated zero-scope: " << elt << std::endl;
         // was already destructed, so don't call ->deleteSelf()
-        ::operator delete(elt);
+        if(!elt->d_noTrash) {
+          ::operator delete(elt);
+        }
       }
     }
   }
index 7b8953dc0e58c53be9a33490fbb005560abc6836..37beb50543fa47e19e7ba1e0afc79c44df7c61f7 100644 (file)
@@ -930,9 +930,8 @@ public:
   };
 
   void testMapOfLists() {
-    try{
-      //Debug.on("gc");
-      //Debug.on("context");
+    //Debug.on("gc");
+    //Debug.on("context");
 
     CDMap<int, CDList<myint>*, int_hasher> map(d_context);
 
@@ -1055,6 +1054,13 @@ public:
     }
 
     TS_ASSERT(d_context->getLevel() == 0);
-  } catch(Exception& e) { cout << e << std::endl; throw e; }
+  }
+
+  void testCmmElementsAtLevel0() {
+    // this was crashing
+
+    CDMap<int, int*, int_hasher> map(d_context);
+    int* a = (int*)d_context->getCMM()->newData(sizeof(int));
+    map.insertDataFromContextMemory(1, a);
   }
 };