Author: Armin Rigo <[email protected]>
Branch:
Changeset: r916:dac6b73eede4
Date: 2014-03-01 22:57 +0100
http://bitbucket.org/pypy/stmgc/changeset/dac6b73eede4/
Log: Fixes until all tests seem to pass.
diff --git a/c7/stm/gcpage.c b/c7/stm/gcpage.c
--- a/c7/stm/gcpage.c
+++ b/c7/stm/gcpage.c
@@ -3,6 +3,9 @@
#endif
+static struct list_s *testing_prebuilt_objs = NULL;
+
+
static void setup_gcpage(void)
{
char *base = stm_object_pages + END_NURSERY_PAGE * 4096UL;
@@ -17,6 +20,7 @@
{
memset(small_alloc, 0, sizeof(small_alloc));
free_uniform_pages = NULL;
+ LIST_FREE(testing_prebuilt_objs);
}
@@ -95,8 +99,6 @@
return addr;
}
-static struct list_s *testing_prebuilt_objs = NULL;
-
object_t *_stm_allocate_old(ssize_t size_rounded_up)
{
/* only for tests */
@@ -198,11 +200,8 @@
LIST_APPEND(mark_objects_to_trace, obj);
}
-static void mark_from_object(object_t *obj, char *segment_base)
+static void mark_trace(object_t *obj, char *segment_base)
{
- if (obj == NULL || mark_visited_test_and_set(obj))
- return;
-
assert(list_is_empty(mark_objects_to_trace));
while (1) {
@@ -217,6 +216,13 @@
}
}
+static inline void mark_visit_object(object_t *obj, char *segment_base)
+{
+ if (obj == NULL || mark_visited_test_and_set(obj))
+ return;
+ mark_trace(obj, segment_base);
+}
+
static void mark_visit_from_roots(void)
{
stm_thread_local_t *tl = stm_all_thread_locals;
@@ -232,16 +238,16 @@
object_t **base = tl->shadowstack_base;
while (current-- != base) {
assert(*current != (object_t *)-1);
- mark_from_object(*current, segment_base);
+ mark_visit_object(*current, segment_base);
}
- mark_from_object(tl->thread_local_obj, segment_base);
+ mark_visit_object(tl->thread_local_obj, segment_base);
tl = tl->next;
} while (tl != stm_all_thread_locals);
if (testing_prebuilt_objs != NULL) {
LIST_FOREACH_R(testing_prebuilt_objs, object_t * /*item*/,
- mark_from_object(item, get_segment_base(0)));
+ mark_visit_object(item, get_segment_base(0)));
}
}
@@ -259,8 +265,9 @@
get_priv_segment(i)->modified_old_objects,
object_t * /*item*/,
({
- mark_from_object(item, base1);
- mark_from_object(item, base2);
+ mark_visited_test_and_set(item);
+ mark_trace(item, base1);
+ mark_trace(item, base2);
}));
}
}
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -324,13 +324,6 @@
def stm_was_written(o):
return lib._stm_was_written(o)
-def stm_creation_marker(o):
- return lib._stm_creation_marker(o)
-
-def stm_stop_transaction():
- if lib._stm_stop_transaction():
- raise Conflict()
-
def stm_start_safe_point():
lib._stm_start_safe_point()
diff --git a/c7/test/test_random.py b/c7/test/test_random.py
--- a/c7/test/test_random.py
+++ b/c7/test/test_random.py
@@ -164,7 +164,9 @@
def pop_roots(self, ex):
for r in reversed(self.saved_roots[self.roots_on_transaction_start:]):
ex.do('%s = self.pop_root()' % r)
- ex.do('# 0x%x' % (int(ffi.cast("uintptr_t", ex.content[r])),))
+ ex.do('# 0x%x, size %d' % (
+ int(ffi.cast("uintptr_t", ex.content[r])),
+ stm_get_obj_size(ex.content[r])))
self.roots_on_stack -= 1
assert self.roots_on_stack == self.roots_on_transaction_start
@@ -176,8 +178,9 @@
for r in reversed(to_reload):
ex.do('%s = self.pop_root()' % r)
for r in to_reload:
- ex.do('self.push_root(%s) # 0x%x' % (
- r, int(ffi.cast("uintptr_t", ex.content[r]))))
+ ex.do('self.push_root(%s) # 0x%x, size %d' % (
+ r, int(ffi.cast("uintptr_t", ex.content[r])),
+ stm_get_obj_size(ex.content[r])))
def start_transaction(self):
assert self.transaction_state is None
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit