Author: Remi Meier <remi.me...@gmail.com>
Branch: c7
Changeset: r622:c6c73c285527
Date: 2014-01-17 12:33 +0100
http://bitbucket.org/pypy/stmgc/changeset/c6c73c285527/

Log:    fix and add tests

diff --git a/c7/core.c b/c7/core.c
--- a/c7/core.c
+++ b/c7/core.c
@@ -150,42 +150,38 @@
 
 struct tx_descriptor *in_single_thread = NULL;
 
-void stm_start_sharedlock(void)
+void stm_start_shared_lock(void)
 {
     int err = pthread_rwlock_rdlock(&rwlock_shared);
     if (err != 0)
         abort();
 }
 
-void stm_stop_sharedlock(void)
+void stm_stop_lock(void)
 {
     int err = pthread_rwlock_unlock(&rwlock_shared);
     if (err != 0)
         abort();
 }
 
-static void start_exclusivelock(void)
+static void stm_start_exclusive_lock(void)
 {
     int err = pthread_rwlock_wrlock(&rwlock_shared);
     if (err != 0)
         abort();
-}
-
-static void stop_exclusivelock(void)
-{
-    int err = pthread_rwlock_unlock(&rwlock_shared);
-    if (err != 0)
-        abort();
+    if (_STM_TL2->need_abort) {
+        stm_abort_transaction();
+    }
 }
 
 void _stm_start_safe_point(void)
 {
-    stm_stop_sharedlock();
+    stm_stop_lock();
 }
 
 void _stm_stop_safe_point(void)
 {
-    stm_start_sharedlock();
+    stm_start_shared_lock();
     if (_STM_TL2->need_abort)
         stm_abort_transaction();
 }
@@ -757,7 +753,7 @@
 {
     assert(!_STM_TL2->running_transaction);
 
-    stm_start_sharedlock();
+    stm_start_shared_lock();
     
     uint8_t old_rv = _STM_TL1->transaction_read_version;
     _STM_TL1->transaction_read_version = old_rv + 1;
@@ -805,8 +801,8 @@
 void stm_stop_transaction(void)
 {
     assert(_STM_TL2->running_transaction);
-    stm_stop_sharedlock();
-    start_exclusivelock();
+    stm_stop_lock();
+    stm_start_exclusive_lock();
 
     _STM_TL1->jmpbufptr = NULL;          /* cannot abort any more */
 
@@ -908,7 +904,7 @@
     /* } */
 
     _STM_TL2->running_transaction = 0;
-    stop_exclusivelock();
+    stm_stop_lock();
 }
 
 void stm_abort_transaction(void)
@@ -927,6 +923,6 @@
     assert(_STM_TL1->jmpbufptr != NULL);
     assert(_STM_TL1->jmpbufptr != (jmpbufptr_t *)-1);   /* for tests only */
     _STM_TL2->running_transaction = 0;
-    stm_stop_sharedlock();
+    stm_stop_lock();
     __builtin_longjmp(*_STM_TL1->jmpbufptr, 1);
 }
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -188,6 +188,9 @@
 
 HDR = lib.SIZEOF_MYOBJ
 
+class Conflict(Exception):
+    pass
+
 def is_in_nursery(o):
     return lib._stm_is_young(o)
 
@@ -252,22 +255,19 @@
 def stm_start_transaction():
     lib.stm_start_transaction(ffi.cast("jmpbufptr_t*", -1))
 
-def stm_stop_transaction(expected_conflict=False):
+def stm_stop_transaction():
     res = lib._stm_stop_transaction()
-    if expected_conflict:
-        assert res == 1
-    else:
-        assert res == 0
+    if res:
+        raise Conflict()
+
 
 def stm_start_safe_point():
     lib._stm_start_safe_point()
 
-def stm_stop_safe_point(expected_conflict=False):
+def stm_stop_safe_point():
     res = lib._stm_check_stop_safe_point()
-    if expected_conflict:
-        assert res == 1
-    else:
-        assert res == 0
+    if res:
+        raise Conflict()
 
 
 class BaseTest(object):
@@ -295,14 +295,12 @@
         lib._stm_teardown_thread()
         lib._stm_teardown()
 
-    def switch(self, thread_num, expect_conflict=False):
+    def switch(self, thread_num):
         assert thread_num != self.current_thread
         if lib._stm_is_in_transaction():
             stm_start_safe_point()
         lib._stm_restore_local_state(thread_num)
         if lib._stm_is_in_transaction():
-            stm_stop_safe_point(expect_conflict)
-        elif expect_conflict:
-            assert False
+            stm_stop_safe_point()
         self.current_thread = thread_num
         
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
@@ -1,5 +1,5 @@
 from support import *
-
+import py
 
 class TestBasic(BaseTest):
 
@@ -92,9 +92,9 @@
         assert stm_get_char(lp1) == 'a'
         #
         self.switch(1)
-        stm_stop_transaction(False)
+        stm_stop_transaction()
         #
-        self.switch(0, expect_conflict=True) # detects rw conflict
+        py.test.raises(Conflict, self.switch, 0) # detects rw conflict
         
     def test_commit_fresh_objects(self):
         stm_start_transaction()
@@ -207,10 +207,10 @@
         #
         self.switch(1)
         stm_start_transaction()
-        stm_stop_transaction(False)
+        stm_stop_transaction()
         #
         self.switch(0)
-        stm_stop_transaction(False)
+        stm_stop_transaction()
 
     def test_resolve_no_conflict_write_only_in_already_committed(self):
         stm_start_transaction()
@@ -218,7 +218,7 @@
         p1 = stm_get_real_address(lp1)
         p1[HDR] = 'a'
         stm_push_root(lp1)
-        stm_stop_transaction(False)
+        stm_stop_transaction()
         lp1 = stm_pop_root()
         # 'a' in SHARED_PAGE
         
@@ -231,7 +231,7 @@
         p1 = stm_get_real_address(lp1)
         assert p1[HDR] == 'a'
         p1[HDR] = 'b'
-        stm_stop_transaction(False)
+        stm_stop_transaction()
         # 'b' both private pages
         #
         self.switch(0)
@@ -239,29 +239,50 @@
         assert p1[HDR] == 'b'
         p1 = stm_get_real_address(lp1)
         assert p1[HDR] == 'b'
-        stm_stop_transaction(False)
+        stm_stop_transaction()
         assert p1[HDR] == 'b'
 
-    # def test_resolve_write_read_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)
-    #     stm_read(p1)
-    #     assert p1[8] == 'a'
-    #     stm_stop_transaction(expected_conflict=True)
-    #     assert p1[8] in ('a', 'b')
-    #     stm_start_transaction()
-    #     assert p1[8] == 'b'
+    def test_not_resolve_write_read_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_read(lp1)
+        #
+        self.switch(1)
+        stm_start_transaction()
+        stm_write(lp1)
+        stm_set_char(lp1, 'b')
+        stm_stop_transaction()
+        #
+        py.test.raises(Conflict, self.switch, 0)
+        stm_start_transaction()
+        assert stm_get_char(lp1) == 'b'
+
+    def test_resolve_write_read_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()
+        #
+        self.switch(1)
+        stm_start_transaction()
+        stm_write(lp1)
+        stm_set_char(lp1, 'b')
+        stm_stop_transaction()
+        #
+        self.switch(0)
+        assert stm_get_char(lp1) == 'b'
+
+        
 
     # def test_resolve_write_write_conflict(self):
     #     stm_start_transaction()
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to