Author: Remi Meier <remi.me...@gmail.com>
Branch: c7
Changeset: r624:6d1c731e3872
Date: 2014-01-17 14:38 +0100
http://bitbucket.org/pypy/stmgc/changeset/6d1c731e3872/

Log:    failing abort cleanup test

diff --git a/c7/core.c b/c7/core.c
--- a/c7/core.c
+++ b/c7/core.c
@@ -164,18 +164,18 @@
         abort();
 }
 
-static void stm_start_exclusive_lock(void)
+void stm_start_exclusive_lock(void)
 {
     int err = pthread_rwlock_wrlock(&rwlock_shared);
     if (err != 0)
         abort();
-    if (_STM_TL2->need_abort) {
+    if (_STM_TL2->need_abort)
         stm_abort_transaction();
-    }
 }
 
 void _stm_start_safe_point(void)
 {
+    assert(!_STM_TL2->need_abort);
     stm_stop_lock();
 }
 
@@ -375,17 +375,19 @@
     /* 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;
     struct object_s *t0_obj = (struct object_s *)t0_addr;
 
-    int previous = __sync_lock_test_and_set(&t0_obj->stm_write_lock, 1);
-    if (previous)
+    int previous;
+    while ((previous = __sync_lock_test_and_set(&t0_obj->stm_write_lock, 1))) {
         stm_abort_transaction();
+        /* XXX: only abort if we are younger */
+        spin_loop();
+    }
 
+    obj->stm_flags &= ~GCFLAG_WRITE_BARRIER;
     stm_read(obj);
 
     _STM_TL2->modified_objects = stm_list_append
@@ -581,7 +583,7 @@
 
 
 void stm_setup(void)
-{
+{    
     pthread_rwlockattr_t attr;
     pthread_rwlockattr_init(&attr);
     pthread_rwlockattr_setkind_np(&attr,
@@ -912,16 +914,28 @@
 void stm_abort_transaction(void)
 {
     assert(_STM_TL2->running_transaction);
-    // XXX copy back the modified objects!!
-    long j;
-    for (j = 2; j < LARGE_OBJECT_WORDS; j++) {
-        alloc_for_size_t *alloc = &_STM_TL2->alloc[j];
-        uint16_t num_allocated = ((uintptr_t)alloc->next) - alloc->start;
-        alloc->next -= num_allocated;
-    }
+    
+    // XXX reset all the modified objects!!
+    stm_list_clear(_STM_TL2->modified_objects);
+
+    /* re-add GCFLAG_WRITE_BARRIER */
+    stm_list_clear(_STM_TL2->old_objects_to_trace);
+
+    /* clear the nursery */
+
+    /* unreserve uncommitted_pages */
+
+    /* XXX: forget about GCFLAG_UNCOMMITTED objects  */
+    
+    /* long j; */
+    /* for (j = 2; j < LARGE_OBJECT_WORDS; j++) { */
+    /*     alloc_for_size_t *alloc = &_STM_TL2->alloc[j]; */
+    /*     uint16_t num_allocated = ((uintptr_t)alloc->next) - alloc->start; */
+    /*     alloc->next -= num_allocated; */
+    /* } */
     /* stm_list_clear(_STM_TL2->new_object_ranges); */
-    stm_list_clear(_STM_TL2->modified_objects);
-    stm_list_clear(_STM_TL2->old_objects_to_trace);
+    
+    
     assert(_STM_TL1->jmpbufptr != NULL);
     assert(_STM_TL1->jmpbufptr != (jmpbufptr_t *)-1);   /* for tests only */
     _STM_TL2->running_transaction = 0;
diff --git a/c7/core.h b/c7/core.h
--- a/c7/core.h
+++ b/c7/core.h
@@ -120,6 +120,8 @@
 
 void _stm_start_safe_point(void);
 void _stm_stop_safe_point(void);
+
+void stm_abort_transaction(void);
 #endif
 
 
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -66,6 +66,9 @@
 void _set_ptr(object_t *obj, int n, object_t *v);
 object_t * _get_ptr(object_t *obj, int n);
 
+
+bool _stm_check_abort_transaction(void);
+
 void *memset(void *s, int c, size_t n);
 """)
 
@@ -126,6 +129,19 @@
     return 1;
 }
 
+bool _stm_check_abort_transaction(void) {
+    jmpbufptr_t here;
+    if (__builtin_setjmp(here) == 0) { // returned directly
+         assert(_STM_TL1->jmpbufptr == (jmpbufptr_t*)-1);
+         _STM_TL1->jmpbufptr = &here;
+         stm_abort_transaction();
+         _STM_TL1->jmpbufptr = (jmpbufptr_t*)-1;
+         return 0;
+    }
+    _STM_TL1->jmpbufptr = (jmpbufptr_t*)-1;
+    return 1;
+}
+
 
 void _set_type_id(object_t *obj, uint32_t h)
 {
@@ -275,6 +291,9 @@
     if lib._stm_stop_transaction():
         raise Conflict()
 
+def stm_abort_transaction():
+    return lib._stm_check_abort_transaction()
+
 
 def stm_start_safe_point():
     lib._stm_start_safe_point()
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
@@ -84,7 +84,6 @@
         stm_write(lp1)
         assert stm_get_char(lp1) == 'a'
         stm_set_char(lp1, 'b')
-        
         #
         self.switch(0)
         stm_start_transaction()
@@ -289,13 +288,28 @@
         stm_push_root(lp1)
         stm_stop_transaction()
         lp1 = stm_pop_root()
+        
         stm_start_transaction()
-        stm_write(lp1)
+        stm_write(lp1) # acquire lock
         #
         self.switch(1)
         stm_start_transaction()
         py.test.raises(Conflict, stm_write, lp1) # write-write conflict
 
+    def test_abort_cleanup(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_set_char(lp1, 'x')
+        assert stm_abort_transaction()
+
+        stm_start_transaction()
+        assert stm_get_char(lp1) == 'a'
 
 
     # def test_resolve_write_write_no_conflict(self):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to