Author: Remi Meier
Branch: c7-weakref
Changeset: r993:1541f27d7248
Date: 2014-03-13 09:53 +0100
http://bitbucket.org/pypy/stmgc/changeset/1541f27d7248/
Log: fix use of STM_SEGMENT during major collections
diff --git a/c7/stm/weakref.c b/c7/stm/weakref.c
--- a/c7/stm/weakref.c
+++ b/c7/stm/weakref.c
@@ -13,9 +13,9 @@
}
-void _set_weakref_in_all_segments(object_t *weakref, object_t *value)
+void _set_weakref_in_all_segments(char* base, object_t *weakref, object_t
*value)
{
- char *realobj = REAL_ADDRESS(STM_SEGMENT->segment_base, weakref);
+ char *realobj = REAL_ADDRESS(base, weakref);
ssize_t size = stmcb_size_rounded_up((struct object_s *)realobj);
stm_char *point_to_loc = (stm_char*)WEAKREF_PTR(weakref, size);
@@ -68,7 +68,8 @@
}
assert(!_is_young(item));
- char *realobj = REAL_ADDRESS(STM_SEGMENT->segment_base, item);
+ char *base = STM_SEGMENT->segment_base;
+ char *realobj = REAL_ADDRESS(base, item);
ssize_t size = stmcb_size_rounded_up((struct object_s *)realobj);
object_t *pointing_to = *WEAKREF_PTR(item, size);
assert(pointing_to != NULL);
@@ -79,12 +80,12 @@
if (!(pointing_to->stm_flags & GCFLAG_HAS_SHADOW)
|| (pforwarded_array[0] != GCWORD_MOVED)) {
/* pointing_to dies */
- _set_weakref_in_all_segments(item, NULL);
+ _set_weakref_in_all_segments(base, item, NULL);
continue; /* no need to remember in old_weakrefs */
}
else {
/* moved location */
- _set_weakref_in_all_segments(item, pforwarded_array[1]);
+ _set_weakref_in_all_segments(base, item,
pforwarded_array[1]);
}
}
else {
@@ -93,7 +94,7 @@
(uintptr_t)pointing_to)) {
/* still in the tree -> wasn't seen by the minor
collection,
so it doesn't survive */
- _set_weakref_in_all_segments(item, NULL);
+ _set_weakref_in_all_segments(base, item, NULL);
continue; /* no need to remember in old_weakrefs */
}
/* pointing_to was already old */
@@ -130,7 +131,7 @@
assert(pointing_to != NULL);
if (!mark_visited_test(pointing_to)) {
//assert(flag_page_private[(uintptr_t)weakref / 4096UL] !=
PRIVATE_PAGE);
- _set_weakref_in_all_segments(weakref, NULL);
+ _set_weakref_in_all_segments(pseg->pub.segment_base, weakref,
NULL);
/* we don't need it in this list anymore */
list_set_item(lst, n, list_pop_item(lst));
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit