Author: Remi Meier <[email protected]>
Branch: stmgc-c8-gcc
Changeset: r79353:9ef3acdbc233
Date: 2015-09-01 17:31 +0200
http://bitbucket.org/pypy/pypy/changeset/9ef3acdbc233/
Log: import stmgc with hashtable fixes
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 @@
-08c773f2b6ef
+58f9e6d56296
diff --git a/rpython/translator/stm/src_stm/stm/core.h
b/rpython/translator/stm/src_stm/stm/core.h
--- a/rpython/translator/stm/src_stm/stm/core.h
+++ b/rpython/translator/stm/src_stm/stm/core.h
@@ -267,14 +267,6 @@
return stm_object_pages + segment_num * (NB_PAGES * 4096UL);
}
-static inline long get_num_segment_containing_address(char *addr)
-{
- uintptr_t delta = addr - stm_object_pages;
- uintptr_t result = delta / (NB_PAGES * 4096UL);
- assert(result < NB_SEGMENTS);
- return result;
-}
-
static inline
struct stm_segment_info_s *get_segment(long segment_num) {
return (struct stm_segment_info_s *)REAL_ADDRESS(
diff --git a/rpython/translator/stm/src_stm/stm/finalizer.c
b/rpython/translator/stm/src_stm/stm/finalizer.c
--- a/rpython/translator/stm/src_stm/stm/finalizer.c
+++ b/rpython/translator/stm/src_stm/stm/finalizer.c
@@ -486,12 +486,7 @@
LIST_FREE(f->run_finalizers);
}
-/* XXX: can there be a race between _invoke_general_finalizers
- and _commit_finalizer on g_finalizers (+other places?)?
- XXX: what happens in _execute_finalizer if the transaction
- conflicts (or fails to become inevitable) in a finalizer?
- (the run_finalizers list is half-way cleared?)
- XXX: according to translator.backendopt.finalizer, getfield_gc
+/* XXX: according to translator.backendopt.finalizer, getfield_gc
for primitive types is a safe op in light finalizers.
I don't think that's correct in general (maybe if
getfield on *dying obj*).
diff --git a/rpython/translator/stm/src_stm/stm/hashtable.c
b/rpython/translator/stm/src_stm/stm/hashtable.c
--- a/rpython/translator/stm/src_stm/stm/hashtable.c
+++ b/rpython/translator/stm/src_stm/stm/hashtable.c
@@ -285,7 +285,8 @@
if (rc > 6) {
/* we can only enter here once! If we allocate stuff, we may
run the GC, and so 'hashtableobj' might move afterwards. */
- if (_is_in_nursery(hashtableobj)) {
+ if (_is_in_nursery(hashtableobj)
+ && will_allocate_in_nursery(sizeof(stm_hashtable_entry_t))) {
/* this also means that the hashtable is from this
transaction and not visible to other segments yet, so
the new entry can be nursery-allocated. */
@@ -325,9 +326,6 @@
stm_allocate_preexisting(sizeof(stm_hashtable_entry_t),
(char *)&initial.header);
hashtable->additions++;
- /* make sure .object is NULL in all segments before
- "publishing" the entry in the hashtable: */
- write_fence();
}
table->items[i] = entry;
write_fence(); /* make sure 'table->items' is written here */
@@ -362,6 +360,9 @@
stm_write((object_t *)entry);
+ /* this restriction may be lifted, see test_new_entry_if_nursery_full:
*/
+ assert(IMPLY(_is_young((object_t *)entry), _is_young(hobj)));
+
uintptr_t i = list_count(STM_PSEGMENT->modified_old_objects);
if (i > 0 && list_item(STM_PSEGMENT->modified_old_objects, i - 3)
== (uintptr_t)entry) {
@@ -486,7 +487,7 @@
objects in the segment of the running transaction. Otherwise,
the base case is to read them all from segment zero.
*/
- long segnum = get_num_segment_containing_address((char *)hobj);
+ long segnum = get_segment_of_linear_address((char *)hobj);
if (!IS_OVERFLOW_OBJ(get_priv_segment(segnum), hobj))
segnum = 0;
diff --git a/rpython/translator/stm/src_stm/stm/nursery.h
b/rpython/translator/stm/src_stm/stm/nursery.h
--- a/rpython/translator/stm/src_stm/stm/nursery.h
+++ b/rpython/translator/stm/src_stm/stm/nursery.h
@@ -27,6 +27,20 @@
get_priv_segment(other_segment_num)->safe_point != SP_RUNNING);
}
+static inline bool will_allocate_in_nursery(size_t size_rounded_up) {
+ OPT_ASSERT(size_rounded_up >= 16);
+ OPT_ASSERT((size_rounded_up & 7) == 0);
+
+ if (UNLIKELY(size_rounded_up >= _STM_FAST_ALLOC))
+ return false;
+
+ stm_char *p = STM_SEGMENT->nursery_current;
+ stm_char *end = p + size_rounded_up;
+ if (UNLIKELY((uintptr_t)end > STM_SEGMENT->nursery_end))
+ return false;
+ return true;
+}
+
#define must_abort() is_abort(STM_SEGMENT->nursery_end)
static object_t *find_shadow(object_t *obj);
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit