[pypy-commit] stmgc default: pass first isolation tests
Raemi
noreply at buildbot.pypy.org
Fri Sep 5 11:52:01 CEST 2014
Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch:
Changeset: r1356:45cc9257f06e
Date: 2014-09-05 11:53 +0200
http://bitbucket.org/pypy/stmgc/changeset/45cc9257f06e/
Log: pass first isolation tests
diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -36,7 +36,7 @@
assert(is_readable_log_page_in(i, pagenum)); /* still... */
/* copy the content from there to our segment */
- dprintf(("pagecopy pagenum:%lu, src: %lu, dst:%lu\n", pagenum, i, my_segnum));
+ dprintf(("pagecopy pagenum:%lu, src: %lu, dst:%d\n", pagenum, i, my_segnum));
pagecopy((char*)(get_virt_page_of(my_segnum, pagenum) * 4096UL),
(char*)(get_virt_page_of(i, pagenum) * 4096UL));
@@ -54,10 +54,9 @@
obj_size = stmcb_size_rounded_up(bk_obj);
assert(obj_size < 4096); /* XXX */
- assert(obj->stm_flags & GCFLAG_WRITE_BARRIER); /* not written here */
memcpy(REAL_ADDRESS(STM_SEGMENT->segment_base, obj),
bk_obj, obj_size);
- assert(obj->stm_flags & GCFLAG_WRITE_BARRIER); /* still not written */
+ assert(obj->stm_flags & GCFLAG_WRITE_BARRIER); /* not written */
}
TREE_LOOP_END;
@@ -75,7 +74,8 @@
{
char *addr = siginfo->si_addr;
dprintf(("si_addr: %p\n", addr));
- if (addr == NULL) { /* actual segfault */
+ if (addr == NULL || addr < stm_object_pages || addr > stm_object_pages+TOTAL_MEMORY) {
+ /* actual segfault */
/* send to GDB */
kill(getpid(), SIGINT);
}
@@ -350,7 +350,7 @@
reset_transaction_read_version();
}
- assert(tree_count(STM_PSEGMENT->modified_old_objects) == 0);
+ assert(tree_is_cleared(STM_PSEGMENT->modified_old_objects));
assert(list_is_empty(STM_PSEGMENT->objects_pointing_to_nursery));
check_nursery_at_transaction_start();
}
@@ -387,9 +387,21 @@
minor_collection(1);
- struct stm_commit_log_entry_s* entry = _validate_and_add_to_commit_log();
+ _validate_and_add_to_commit_log();
+
acquire_modified_objs_lock(STM_SEGMENT->segment_num);
- /* XXX:discard backup copies */
+
+ struct tree_s *tree = STM_PSEGMENT->modified_old_objects;
+ wlog_t *item;
+ TREE_LOOP_FORWARD(tree, item);
+ object_t *obj = (object_t*)item->addr;
+ struct object_s* bk_obj = (struct object_s *)item->val;
+ free(bk_obj);
+ obj->stm_flags |= GCFLAG_WRITE_BARRIER;
+ TREE_LOOP_END;
+
+ tree_clear(tree);
+
release_modified_objs_lock(STM_SEGMENT->segment_num);
s_mutex_lock();
diff --git a/c8/stm/gcpage.c b/c8/stm/gcpage.c
--- a/c8/stm/gcpage.c
+++ b/c8/stm/gcpage.c
@@ -51,7 +51,9 @@
object_t *o = (object_t *)(p - stm_object_pages);
o->stm_flags = GCFLAG_WRITE_BARRIER;
- dprintf(("allocate_old(%lu): %p, seg=%d\n", size_rounded_up, p,
- get_segment_of_linear_address(p)));
+ dprintf(("allocate_old(%lu): %p, seg=%d, page=%lu\n",
+ size_rounded_up, p,
+ get_segment_of_linear_address(p),
+ (p - STM_SEGMENT->segment_base) / 4096UL));
return o;
}
diff --git a/c8/stm/list.c b/c8/stm/list.c
--- a/c8/stm/list.c
+++ b/c8/stm/list.c
@@ -45,6 +45,7 @@
tree->raw_current = tree->raw_start;
tree->count = 0;
}
+ assert(tree->count == 0);
}
static struct tree_s *tree_create(void)
@@ -99,6 +100,7 @@
newtree.raw_start = newitems;
newtree.raw_current = newitems;
newtree.raw_end = newitems + newalloc;
+ newtree.count = 0;
_tree_clear_node(&newtree.toplevel);
TREE_LOOP_FORWARD(tree, item)
{
@@ -146,7 +148,7 @@
/* reuse the deleted entry and that's it */
wlog1->addr = addr;
wlog1->val = val;
- tree->count++;
+ (tree->count)++;
return;
}
/* the key must not already be present */
@@ -168,7 +170,7 @@
wlog->addr = addr;
wlog->val = val;
*(char **)p = (char *)wlog;
- tree->count++;
+ (tree->count)++;
}
static bool tree_delete_item(struct tree_s *tree, uintptr_t addr)
diff --git a/c8/stm/list.h b/c8/stm/list.h
--- a/c8/stm/list.h
+++ b/c8/stm/list.h
@@ -124,8 +124,8 @@
} wlog_node_t;
struct tree_s {
+ uintptr_t count;
char *raw_start, *raw_current, *raw_end;
- uintptr_t count;
wlog_node_t toplevel;
};
@@ -135,10 +135,12 @@
//static inline void tree_delete_not_used_any_more(struct tree_s *tree)...
static inline bool tree_is_cleared(struct tree_s *tree) {
+ assert((tree->raw_current == tree->raw_start) == (tree->count == 0));
return tree->raw_current == tree->raw_start;
}
static inline uintptr_t tree_count(struct tree_s *tree) {
+ assert(tree->count >= 0);
return tree->count;
}
diff --git a/c8/stm/misc.c b/c8/stm/misc.c
--- a/c8/stm/misc.c
+++ b/c8/stm/misc.c
@@ -46,8 +46,8 @@
#ifdef STM_TESTS
long _stm_count_modified_old_objects(void)
{
- if (STM_PSEGMENT->modified_old_objects == NULL)
- return -1;
+ assert(STM_PSEGMENT->modified_old_objects);
+ assert(tree_count(STM_PSEGMENT->modified_old_objects) < 10000);
return tree_count(STM_PSEGMENT->modified_old_objects);
}
diff --git a/c8/stm/pages.c b/c8/stm/pages.c
--- a/c8/stm/pages.c
+++ b/c8/stm/pages.c
@@ -117,11 +117,16 @@
/* we hopefully hold the privatization lock: */
assert(get_priv_segment(segnum)->privatization_lock);
- char *addr = get_virt_page_of(segnum, pagenum);
+ if ((prot == PROT_NONE && !is_readable_log_page_in(segnum, pagenum))
+ || (prot == (PROT_READ|PROT_WRITE) && is_readable_log_page_in(segnum, pagenum)))
+ return;
+
+ char *addr = (char*)(get_virt_page_of(segnum, pagenum) * 4096UL);
mprotect(addr, count * 4096UL, prot);
- dprintf(("pages_set_protection(%d, %lu, %lu, %d)\n",
- segnum, pagenum, count, prot));
+ dprintf(("pages_set_protection(%d, %lu, %lu, %d), virtpage:%lu\n",
+ segnum, pagenum, count, prot,
+ get_virt_page_of(segnum, pagenum)));
uint64_t bitmask = 1UL << segnum;
uintptr_t amount = count;
diff --git a/c8/test/test_basic.py b/c8/test/test_basic.py
--- a/c8/test/test_basic.py
+++ b/c8/test/test_basic.py
@@ -81,7 +81,6 @@
def test_read_write_1(self):
lp1 = stm_allocate_old(16)
stm_get_real_address(lp1)[HDR] = 'a' #setchar
- lib._push_obj_to_other_segments(lp1)
#
self.start_transaction()
self.commit_transaction()
More information about the pypy-commit
mailing list