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