Author: Armin Rigo <[email protected]>
Branch: finalizer
Changeset: r1462:9541076ea2ae
Date: 2014-10-06 16:17 +0200
http://bitbucket.org/pypy/stmgc/changeset/9541076ea2ae/

Log:    in-progress

diff --git a/c7/stm/core.h b/c7/stm/core.h
--- a/c7/stm/core.h
+++ b/c7/stm/core.h
@@ -201,6 +201,7 @@
 
     /* Lightweight finalizers */
     struct list_s *young_objects_with_light_finalizers;
+    struct list_s *old_objects_with_light_finalizers;
 };
 
 enum /* safe_point */ {
diff --git a/c7/stm/finalizer.c b/c7/stm/finalizer.c
--- a/c7/stm/finalizer.c
+++ b/c7/stm/finalizer.c
@@ -4,8 +4,14 @@
 
 void stm_enable_light_finalizer(object_t *obj)
 {
-    STM_PSEGMENT->young_objects_with_light_finalizers = list_append(
-        STM_PSEGMENT->young_objects_with_light_finalizers, (uintptr_t)obj);
+    if (_is_young(obj)) {
+        STM_PSEGMENT->young_objects_with_light_finalizers = list_append(
+            STM_PSEGMENT->young_objects_with_light_finalizers, (uintptr_t)obj);
+    }
+    else {
+        STM_PSEGMENT->old_objects_with_light_finalizers = list_append(
+            STM_PSEGMENT->old_objects_with_light_finalizers, (uintptr_t)obj);
+    }
 }
 
 static void deal_with_young_objects_with_finalizers(void)
@@ -14,13 +20,18 @@
     long i, count = list_count(lst);
     for (i = 0; i < count; i++) {
         object_t* obj = (object_t *)list_item(lst, i);
+        assert(_is_young(obj));
+
         object_t *TLPREFIX *pforwarded_array = (object_t *TLPREFIX *)obj;
         if (pforwarded_array[0] != GCWORD_MOVED) {
             /* not moved: the object dies */
             stmcb_light_finalizer(obj);
         }
         else {
-            /*...*/
+            obj = pforwarded_array[1]; /* moved location */
+            assert(!_is_young(obj));
+            STM_PSEGMENT->old_objects_with_light_finalizers = list_append(
+               STM_PSEGMENT->old_objects_with_light_finalizers, 
(uintptr_t)obj);
         }
     }
     list_clear(lst);
diff --git a/c7/stm/setup.c b/c7/stm/setup.c
--- a/c7/stm/setup.c
+++ b/c7/stm/setup.c
@@ -129,6 +129,7 @@
         pr->callbacks_on_commit_and_abort[0] = tree_create();
         pr->callbacks_on_commit_and_abort[1] = tree_create();
         pr->young_objects_with_light_finalizers = list_create();
+        pr->old_objects_with_light_finalizers = list_create();
         pr->overflow_number = GCFLAG_OVERFLOW_NUMBER_bit0 * i;
         highest_overflow_number = pr->overflow_number;
         pr->pub.transaction_read_version = 0xff;
@@ -171,6 +172,7 @@
         tree_free(pr->callbacks_on_commit_and_abort[0]);
         tree_free(pr->callbacks_on_commit_and_abort[1]);
         list_free(pr->young_objects_with_light_finalizers);
+        list_free(pr->old_objects_with_light_finalizers);
     }
 
     munmap(stm_object_pages, TOTAL_MEMORY);
diff --git a/c7/test/test_finalizer.py b/c7/test/test_finalizer.py
--- a/c7/test/test_finalizer.py
+++ b/c7/test/test_finalizer.py
@@ -39,3 +39,13 @@
         self.push_root(lp1)       # stays alive
         self.commit_transaction()
         self.expect_finalized([])
+
+    def test_old_light_finalizer(self):
+        self.start_transaction()
+        lp1 = stm_allocate(48)
+        self.push_root(lp1)
+        stm_minor_collect()
+        lp1 = self.pop_root()
+        lib.stm_enable_light_finalizer(lp1)
+        self.commit_transaction()
+        self.expect_finalized([])
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to