[pypy-commit] stmgc default: introduce stmcb_obj_supports_cards and hopefully make cards finally work as they should
Raemi
noreply at buildbot.pypy.org
Mon Sep 1 11:45:11 CEST 2014
Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch:
Changeset: r1326:83e4c655d31b
Date: 2014-09-01 11:46 +0200
http://bitbucket.org/pypy/stmgc/changeset/83e4c655d31b/
Log: introduce stmcb_obj_supports_cards and hopefully make cards finally
work as they should
diff --git a/c7/demo/demo2.c b/c7/demo/demo2.c
--- a/c7/demo/demo2.c
+++ b/c7/demo/demo2.c
@@ -43,6 +43,10 @@
n = (struct node_s*)obj;
visit((object_t **)&n->next);
}
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+ return 0;
+}
void stmcb_get_card_base_itemsize(struct object_s *obj,
uintptr_t offset_itemsize[2])
{
diff --git a/c7/demo/demo_largemalloc.c b/c7/demo/demo_largemalloc.c
--- a/c7/demo/demo_largemalloc.c
+++ b/c7/demo/demo_largemalloc.c
@@ -24,7 +24,10 @@
}
void stmcb_commit_soon() {}
-
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+ return 0;
+}
void stmcb_trace_cards(struct object_s *obj, void cb(object_t **),
uintptr_t start, uintptr_t stop) {
abort();
diff --git a/c7/demo/demo_random.c b/c7/demo/demo_random.c
--- a/c7/demo/demo_random.c
+++ b/c7/demo/demo_random.c
@@ -80,7 +80,10 @@
}
void stmcb_commit_soon() {}
-
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+ return 0;
+}
void stmcb_trace_cards(struct object_s *obj, void cb(object_t **),
uintptr_t start, uintptr_t stop) {
abort();
diff --git a/c7/demo/demo_random2.c b/c7/demo/demo_random2.c
--- a/c7/demo/demo_random2.c
+++ b/c7/demo/demo_random2.c
@@ -85,6 +85,10 @@
void stmcb_commit_soon() {}
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+ return 0;
+}
void stmcb_trace_cards(struct object_s *obj, void cb(object_t **),
uintptr_t start, uintptr_t stop) {
abort();
diff --git a/c7/demo/demo_simple.c b/c7/demo/demo_simple.c
--- a/c7/demo/demo_simple.c
+++ b/c7/demo/demo_simple.c
@@ -38,7 +38,10 @@
n = (struct node_s*)obj;
visit((object_t **)&n->next);
}
-
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+ return 0;
+}
void stmcb_commit_soon() {}
void stmcb_trace_cards(struct object_s *obj, void cb(object_t **),
diff --git a/c7/demo/test_shadowstack.c b/c7/demo/test_shadowstack.c
--- a/c7/demo/test_shadowstack.c
+++ b/c7/demo/test_shadowstack.c
@@ -18,6 +18,10 @@
void stmcb_trace(struct object_s *obj, void visit(object_t **))
{
}
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+ return 0;
+}
void stmcb_get_card_base_itemsize(struct object_s *obj,
uintptr_t offset_itemsize[2])
{
diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -231,8 +231,12 @@
{
struct object_s *realobj = (struct object_s *)
REAL_ADDRESS(STM_SEGMENT->segment_base, obj);
+ long supports = stmcb_obj_supports_cards(realobj);
+ if (!supports)
+ return 0;
+
+ /* check also if it makes sense: */
size_t size = stmcb_size_rounded_up(realobj);
-
return (size >= _STM_MIN_CARD_OBJ_SIZE);
}
@@ -590,13 +594,16 @@
assert(!(obj->stm_flags & GCFLAG_CARDS_SET));
assert(!IS_OVERFLOW_OBJ(STM_PSEGMENT, obj));
+ uintptr_t offset_itemsize[2];
struct object_s *realobj = (struct object_s *)REAL_ADDRESS(STM_SEGMENT->segment_base, obj);
size_t obj_size = stmcb_size_rounded_up(realobj);
assert(obj_size >= 32);
+ stmcb_get_card_base_itemsize(realobj, offset_itemsize);
+ size_t real_idx_count = (obj_size - offset_itemsize[0]) / offset_itemsize[1];
uintptr_t first_card_index = get_write_lock_idx((uintptr_t)obj);
uintptr_t card_index = 1;
- uintptr_t last_card_index = get_index_to_card_index(obj_size - 1); /* max valid index */
+ uintptr_t last_card_index = get_index_to_card_index(real_idx_count - 1); /* max valid index */
long i, myself = STM_SEGMENT->segment_num;
/* simple heuristic to check if probably the whole object is
@@ -617,7 +624,6 @@
/* Combine multiple marked cards and do a memcpy for them. We don't
try yet to use page_copy() or otherwise take into account privatization
of pages (except _has_private_page_in_range) */
- uintptr_t offset_itemsize[2];
bool all_cards_were_cleared = true;
uintptr_t start_card_index = -1;
@@ -634,7 +640,6 @@
/* realobj, get_card_index_to_index(card_index)); */
if (all_cards_were_cleared) {
all_cards_were_cleared = false;
- stmcb_get_card_base_itemsize(realobj, offset_itemsize);
}
}
}
diff --git a/c7/stm/nursery.c b/c7/stm/nursery.c
--- a/c7/stm/nursery.c
+++ b/c7/stm/nursery.c
@@ -241,8 +241,12 @@
#undef STM_SEGMENT
struct object_s *realobj = (struct object_s *)REAL_ADDRESS(pseg->pub.segment_base, obj);
size_t size = stmcb_size_rounded_up(realobj);
+ OPT_ASSERT(size >= _STM_MIN_CARD_OBJ_SIZE);
- OPT_ASSERT(size >= _STM_MIN_CARD_OBJ_SIZE);
+ uintptr_t offset_itemsize[2];
+ stmcb_get_card_base_itemsize(realobj, offset_itemsize);
+ size = (size - offset_itemsize[0]) / offset_itemsize[1];
+
assert(IMPLY(mark_value == CARD_CLEAR, !mark_all)); /* not necessary */
assert(IMPLY(mark_all, mark_value == CARD_MARKED_OLD)); /* set *all* to OLD */
assert(IMPLY(IS_OVERFLOW_OBJ(pseg, realobj),
diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -259,6 +259,9 @@
one item */
extern void stmcb_get_card_base_itemsize(struct object_s *,
uintptr_t offset_itemsize[2]);
+/* returns whether this object supports cards. we will only call
+ stmcb_get_card_base_itemsize on objs that do so. */
+extern long stmcb_obj_supports_cards(struct object_s *);
extern void stmcb_commit_soon(void);
@@ -367,7 +370,7 @@
int stm_is_inevitable(void);
#else
static inline int stm_is_inevitable(void) {
- return !rewind_jmp_armed(&STM_SEGMENT->running_thread->rjthread);
+ return !rewind_jmp_armed(&STM_SEGMENT->running_thread->rjthread);
}
#endif
static inline void stm_become_inevitable(stm_thread_local_t *tl,
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -301,7 +301,10 @@
visit(ref);
}
}
-
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+ return 1;
+}
void stmcb_trace_cards(struct object_s *obj, void visit(object_t **),
uintptr_t start, uintptr_t stop)
{
More information about the pypy-commit
mailing list