[pypy-commit] pypy stmgc-c8-gcc: import stmgc with hashtable fixes
Raemi
noreply at buildbot.pypy.org
Tue Sep 8 13:20:08 CEST 2015
Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch: stmgc-c8-gcc
Changeset: r79533:64cda3ebddce
Date: 2015-09-08 13:20 +0200
http://bitbucket.org/pypy/pypy/changeset/64cda3ebddce/
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 @@
-bba995bf44bc
+8cba33de2246+
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
@@ -1212,6 +1212,8 @@
in abort_data_structures_from_segment_num() */
STM_SEGMENT->nursery_mark = ((stm_char *)_stm_nursery_start +
stm_fill_mark_nursery_bytes);
+ } else if (repeat_count >= 5) {
+ _stm_become_inevitable("too many retries");
}
return repeat_count;
}
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
@@ -150,8 +150,9 @@
static void _stm_rehash_hashtable(stm_hashtable_t *hashtable,
uintptr_t biggercount,
- char *segment_base)
+ long segnum) /* segnum=-1 if no major GC */
{
+ char *segment_base = segnum == -1 ? NULL : get_segment_base(segnum);
dprintf(("rehash %p to size %ld, segment_base=%p\n",
hashtable, biggercount, segment_base));
@@ -175,22 +176,26 @@
stm_hashtable_entry_t *entry = table->items[j];
if (entry == NULL)
continue;
- if (segment_base != NULL) {
+
+ char *to_read_from = segment_base;
+ if (segnum != -1) {
/* -> compaction during major GC */
+ to_read_from = get_page_status_in(segnum, (uintptr_t)entry / 4096UL) == PAGE_NO_ACCESS
+ ? stm_object_pages : to_read_from;
if (((struct stm_hashtable_entry_s *)
- REAL_ADDRESS(segment_base, entry))->object == NULL &&
- !_stm_was_read_by_anybody((object_t *)entry)) {
- dprintf((" removing dead %p\n", entry));
+ REAL_ADDRESS(to_read_from, entry))->object == NULL &&
+ !_stm_was_read_by_anybody((object_t *)entry)) {
+ dprintf((" removing dead %p at %ld\n", entry, j));
continue;
}
}
uintptr_t eindex;
- if (segment_base == NULL)
+ if (segnum == -1)
eindex = entry->index; /* read from STM_SEGMENT */
else
eindex = ((struct stm_hashtable_entry_s *)
- REAL_ADDRESS(segment_base, entry))->index;
+ REAL_ADDRESS(to_read_from, entry))->index;
dprintf((" insert_clean %p at index=%ld\n",
entry, eindex));
@@ -222,8 +227,10 @@
i = index & mask;
entry = VOLATILE_TABLE(table)->items[i];
if (entry != NULL) {
- if (entry->index == index)
+ if (entry->index == index) {
+ stm_read((object_t*)entry);
return entry; /* found at the first try */
+ }
uintptr_t perturb = index;
while (1) {
@@ -231,8 +238,10 @@
i &= mask;
entry = VOLATILE_TABLE(table)->items[i];
if (entry != NULL) {
- if (entry->index == index)
+ if (entry->index == index) {
+ stm_read((object_t*)entry);
return entry; /* found */
+ }
}
else
break;
@@ -326,16 +335,11 @@
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. In other words,
- the following write_fence() prevents a partially
- initialized 'entry' from showing up in table->items[i],
- where it could be read from other threads. */
- write_fence();
}
table->items[i] = entry;
write_fence(); /* make sure 'table->items' is written here */
VOLATILE_TABLE(table)->resize_counter = rc - 6; /* unlock */
+ stm_read((object_t*)entry);
return entry;
}
else {
@@ -346,7 +350,7 @@
biggercount *= 4;
else
biggercount *= 2;
- _stm_rehash_hashtable(hashtable, biggercount, /*segment_base=*/NULL);
+ _stm_rehash_hashtable(hashtable, biggercount, /*segnum=*/-1);
goto restart;
}
}
@@ -507,7 +511,7 @@
assert(count <= table->mask + 1);
dprintf(("compact with %ld items:\n", num_entries_times_6 / 6));
- _stm_rehash_hashtable(hashtable, count, get_segment_base(segnum));
+ _stm_rehash_hashtable(hashtable, count, segnum);
}
table = hashtable->table;
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
@@ -725,6 +725,9 @@
stm_hashtable_t *stm_hashtable_create(void);
void stm_hashtable_free(stm_hashtable_t *);
+/* lookup returns a reference to an entry. This entry is only valid
+ in the current transaction and needs to be looked up again if there
+ may have been a break inbetween. */
stm_hashtable_entry_t *stm_hashtable_lookup(object_t *, stm_hashtable_t *,
uintptr_t key);
object_t *stm_hashtable_read(object_t *, stm_hashtable_t *, uintptr_t key);
More information about the pypy-commit
mailing list