Author: Remi Meier <[email protected]>
Branch: c7
Changeset: r623:feff1f2a98a1
Date: 2014-01-17 12:56 +0100
http://bitbucket.org/pypy/stmgc/changeset/feff1f2a98a1/
Log: changes in testing framework and fix
diff --git a/c7/core.c b/c7/core.c
--- a/c7/core.c
+++ b/c7/core.c
@@ -363,18 +363,20 @@
_STM_TL2->old_objects_to_trace = stm_list_append
(_STM_TL2->old_objects_to_trace, obj);
- obj->stm_flags &= ~GCFLAG_WRITE_BARRIER;
-
+
/* for old objects from the same transaction we don't need
to privatize the page */
if ((flag_page_private[pagenum] == UNCOMMITTED_SHARED_PAGE)
|| (obj->stm_flags & GCFLAG_NOT_COMMITTED)) {
+ obj->stm_flags &= ~GCFLAG_WRITE_BARRIER;
return;
}
/* privatize if SHARED_PAGE */
_stm_privatize(pagenum);
+ obj->stm_flags &= ~GCFLAG_WRITE_BARRIER;
+
/* lock the object for writing in thread 0's page */
uintptr_t t0_offset = (uintptr_t)obj;
char* t0_addr = get_thread_base(0) + t0_offset;
@@ -382,7 +384,7 @@
int previous = __sync_lock_test_and_set(&t0_obj->stm_write_lock, 1);
if (previous)
- abort(); /* XXX */
+ stm_abort_transaction();
stm_read(obj);
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -39,6 +39,7 @@
void stm_read(object_t *object);
void stm_write(object_t *object);
+bool _checked_stm_write(object_t *object);
_Bool _stm_was_read(object_t *object);
_Bool _stm_was_written(object_t *object);
@@ -85,6 +86,20 @@
return 16;
}
+
+bool _checked_stm_write(object_t *object) {
+ jmpbufptr_t here;
+ if (__builtin_setjmp(here) == 0) { // returned directly
+ assert(_STM_TL1->jmpbufptr == (jmpbufptr_t*)-1);
+ _STM_TL1->jmpbufptr = &here;
+ stm_write(object);
+ _STM_TL1->jmpbufptr = (jmpbufptr_t*)-1;
+ return 0;
+ }
+ _STM_TL1->jmpbufptr = (jmpbufptr_t*)-1;
+ return 1;
+}
+
bool _stm_stop_transaction(void) {
jmpbufptr_t here;
if (__builtin_setjmp(here) == 0) { // returned directly
@@ -238,7 +253,8 @@
lib.stm_read(o)
def stm_write(o):
- lib.stm_write(o)
+ if lib._checked_stm_write(o):
+ raise Conflict()
def stm_was_read(o):
return lib._stm_was_read(o)
@@ -256,8 +272,7 @@
lib.stm_start_transaction(ffi.cast("jmpbufptr_t*", -1))
def stm_stop_transaction():
- res = lib._stm_stop_transaction()
- if res:
+ if lib._stm_stop_transaction():
raise Conflict()
@@ -265,8 +280,7 @@
lib._stm_start_safe_point()
def stm_stop_safe_point():
- res = lib._stm_check_stop_safe_point()
- if res:
+ if lib._stm_check_stop_safe_point():
raise Conflict()
diff --git a/c7/test/test_basic.py b/c7/test/test_basic.py
--- a/c7/test/test_basic.py
+++ b/c7/test/test_basic.py
@@ -282,29 +282,21 @@
self.switch(0)
assert stm_get_char(lp1) == 'b'
-
+ def test_resolve_write_write_conflict(self):
+ stm_start_transaction()
+ lp1 = stm_allocate(16)
+ stm_set_char(lp1, 'a')
+ stm_push_root(lp1)
+ stm_stop_transaction()
+ lp1 = stm_pop_root()
+ stm_start_transaction()
+ stm_write(lp1)
+ #
+ self.switch(1)
+ stm_start_transaction()
+ py.test.raises(Conflict, stm_write, lp1) # write-write conflict
- # def test_resolve_write_write_conflict(self):
- # stm_start_transaction()
- # p1 = stm_allocate(16)
- # p1[8] = 'a'
- # stm_stop_transaction(False)
- # stm_start_transaction()
- # #
- # self.switch(1)
- # stm_start_transaction()
- # stm_write(p1)
- # p1[8] = 'b'
- # stm_stop_transaction(False)
- # #
- # self.switch(0)
- # assert p1[8] == 'a'
- # stm_write(p1)
- # p1[8] = 'c'
- # stm_stop_transaction(expected_conflict=True)
- # assert p1[8] in ('a', 'b')
- # stm_start_transaction()
- # assert p1[8] == 'b'
+
# def test_resolve_write_write_no_conflict(self):
# stm_start_transaction()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit