Author: Remi Meier <[email protected]>
Branch: stmgc-c7
Changeset: r73267:960172cff05f
Date: 2014-09-01 12:43 +0200
http://bitbucket.org/pypy/pypy/changeset/960172cff05f/
Log: import stmgc
diff --git a/rpython/translator/stm/src_stm/revision
b/rpython/translator/stm/src_stm/revision
--- a/rpython/translator/stm/src_stm/revision
+++ b/rpython/translator/stm/src_stm/revision
@@ -1,1 +1,1 @@
-dbe9b14b252f
+83e4c655d31b
diff --git a/rpython/translator/stm/src_stm/stm/core.c
b/rpython/translator/stm/src_stm/stm/core.c
--- a/rpython/translator/stm/src_stm/stm/core.c
+++ b/rpython/translator/stm/src_stm/stm/core.c
@@ -232,8 +232,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);
}
@@ -591,13 +595,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
@@ -618,7 +625,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;
@@ -635,7 +641,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/rpython/translator/stm/src_stm/stm/nursery.c
b/rpython/translator/stm/src_stm/stm/nursery.c
--- a/rpython/translator/stm/src_stm/stm/nursery.c
+++ b/rpython/translator/stm/src_stm/stm/nursery.c
@@ -242,8 +242,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/rpython/translator/stm/src_stm/stmgc.h
b/rpython/translator/stm/src_stm/stmgc.h
--- a/rpython/translator/stm/src_stm/stmgc.h
+++ b/rpython/translator/stm/src_stm/stmgc.h
@@ -260,6 +260,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);
@@ -368,7 +371,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,
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit