[pypy-commit] stmgc default: Add last_abort__bytes_in_nursery.

arigo noreply at buildbot.pypy.org
Wed Mar 12 08:04:29 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r975:5edbae0c780a
Date: 2014-03-12 08:04 +0100
http://bitbucket.org/pypy/stmgc/changeset/5edbae0c780a/

Log:	Add last_abort__bytes_in_nursery.

diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -466,7 +466,7 @@
     struct stm_priv_segment_info_s *pseg = get_priv_segment(segment_num);
 
     /* throw away the content of the nursery */
-    throw_away_nursery(pseg);
+    long bytes_in_nursery = throw_away_nursery(pseg);
 
     /* reset all the modified objects (incl. re-adding GCFLAG_WRITE_BARRIER) */
     reset_modified_from_other_segments(segment_num);
@@ -476,6 +476,7 @@
     stm_thread_local_t *tl = pseg->pub.running_thread;
     tl->shadowstack = pseg->shadowstack_at_start_of_transaction;
     tl->thread_local_obj = pseg->threadlocal_at_start_of_transaction;
+    tl->last_abort__bytes_in_nursery = bytes_in_nursery;
 
     /* reset these lists to NULL too on abort */
     LIST_FREE(pseg->objects_pointing_to_nursery);
diff --git a/c7/stm/nursery.c b/c7/stm/nursery.c
--- a/c7/stm/nursery.c
+++ b/c7/stm/nursery.c
@@ -215,15 +215,15 @@
                    _collect_now(item));
 }
 
-static void throw_away_nursery(struct stm_priv_segment_info_s *pseg)
+static size_t throw_away_nursery(struct stm_priv_segment_info_s *pseg)
 {
     /* reset the nursery by zeroing it */
-    size_t size;
+    size_t nursery_used;
     char *realnursery;
 
     realnursery = REAL_ADDRESS(pseg->pub.segment_base, _stm_nursery_start);
-    size = pseg->pub.nursery_current - (stm_char *)_stm_nursery_start;
-    memset(realnursery, 0, size);
+    nursery_used = pseg->pub.nursery_current - (stm_char *)_stm_nursery_start;
+    memset(realnursery, 0, nursery_used);
 
     pseg->pub.nursery_current = (stm_char *)_stm_nursery_start;
 
@@ -250,6 +250,7 @@
     }
 
     tree_clear(pseg->nursery_objects_shadows);
+    return nursery_used;
 }
 
 #define MINOR_NOTHING_TO_DO(pseg)                                       \
diff --git a/c7/stm/nursery.h b/c7/stm/nursery.h
--- a/c7/stm/nursery.h
+++ b/c7/stm/nursery.h
@@ -11,7 +11,7 @@
 
 static void minor_collection(bool commit);
 static void check_nursery_at_transaction_start(void);
-static void throw_away_nursery(struct stm_priv_segment_info_s *pseg);
+static size_t throw_away_nursery(struct stm_priv_segment_info_s *pseg);
 static void major_do_minor_collections(void);
 
 static inline bool must_abort(void) {
diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -57,7 +57,10 @@
        the following raw region of memory is cleared. */
     char *mem_clear_on_abort;
     size_t mem_bytes_to_clear_on_abort;
-    /* the next fields are handled automatically by the library */
+    /* after an abort, some details about the abort are stored there.
+       (these fields are not modified on a successful commit) */
+    long last_abort__bytes_in_nursery;
+    /* the next fields are handled internally by the library */
     int associated_segment_num;
     struct stm_thread_local_s *prev, *next;
 } stm_thread_local_t;
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -17,6 +17,7 @@
     object_t *thread_local_obj;
     char *mem_clear_on_abort;
     size_t mem_bytes_to_clear_on_abort;
+    long last_abort__bytes_in_nursery;
     int associated_segment_num;
     ...;
 } stm_thread_local_t;
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
@@ -433,118 +433,16 @@
         lp1 = self.pop_root()
         self.check_char_everywhere(lp1, 'X')
 
-    # def test_resolve_write_write_no_conflict(self):
-    #     self.start_transaction()
-    #     p1 = stm_allocate(16)
-    #     p2 = stm_allocate(16)
-    #     p1[8] = 'a'
-    #     p2[8] = 'A'
-    #     self.commit_transaction(False)
-    #     self.start_transaction()
-    #     #
-    #     self.switch(1)
-    #     self.start_transaction()
-    #     stm_write(p1)
-    #     p1[8] = 'b'
-    #     self.commit_transaction(False)
-    #     #
-    #     self.switch(0)
-    #     stm_write(p2)
-    #     p2[8] = 'C'
-    #     self.commit_transaction(False)
-    #     assert p1[8] == 'b'
-    #     assert p2[8] == 'C'
-
-    # def test_page_extra_malloc_unchanged_page(self):
-    #     self.start_transaction()
-    #     p1 = stm_allocate(16)
-    #     p2 = stm_allocate(16)
-    #     p1[8] = 'A'
-    #     p2[8] = 'a'
-    #     self.commit_transaction(False)
-    #     self.start_transaction()
-    #     #
-    #     self.switch(1)
-    #     self.start_transaction()
-    #     stm_write(p1)
-    #     assert p1[8] == 'A'
-    #     p1[8] = 'B'
-    #     self.commit_transaction(False)
-    #     #
-    #     self.switch(0)
-    #     stm_read(p2)
-    #     assert p2[8] == 'a'
-    #     p3 = stm_allocate(16)   # goes into the same page, which is
-    #     p3[8] = ':'             #  not otherwise modified
-    #     self.commit_transaction(False)
-    #     #
-    #     assert p1[8] == 'B'
-    #     assert p2[8] == 'a'
-    #     assert p3[8] == ':'
-
-    # def test_page_extra_malloc_changed_page_before(self):
-    #     self.start_transaction()
-    #     p1 = stm_allocate(16)
-    #     p2 = stm_allocate(16)
-    #     p1[8] = 'A'
-    #     p2[8] = 'a'
-    #     self.commit_transaction(False)
-    #     self.start_transaction()
-    #     #
-    #     self.switch(1)
-    #     self.start_transaction()
-    #     stm_write(p1)
-    #     assert p1[8] == 'A'
-    #     p1[8] = 'B'
-    #     self.commit_transaction(False)
-    #     #
-    #     self.switch(0)
-    #     stm_write(p2)
-    #     assert p2[8] == 'a'
-    #     p2[8] = 'b'
-    #     p3 = stm_allocate(16)  # goes into the same page, which I already
-    #     p3[8] = ':'            #  modified just above
-    #     self.commit_transaction(False)
-    #     #
-    #     assert p1[8] == 'B'
-    #     assert p2[8] == 'b'
-    #     assert p3[8] == ':'
-
-    # def test_page_extra_malloc_changed_page_after(self):
-    #     self.start_transaction()
-    #     p1 = stm_allocate(16)
-    #     p2 = stm_allocate(16)
-    #     p1[8] = 'A'
-    #     p2[8] = 'a'
-    #     self.commit_transaction(False)
-    #     self.start_transaction()
-    #     #
-    #     self.switch(1)
-    #     self.start_transaction()
-    #     stm_write(p1)
-    #     assert p1[8] == 'A'
-    #     p1[8] = 'B'
-    #     self.commit_transaction(False)
-    #     #
-    #     self.switch(0)
-    #     p3 = stm_allocate(16)  # goes into the same page, which I will
-    #     p3[8] = ':'            #  modify just below
-    #     stm_write(p2)
-    #     assert p2[8] == 'a'
-    #     p2[8] = 'b'
-    #     self.commit_transaction(False)
-    #     #
-    #     assert p1[8] == 'B'
-    #     assert p2[8] == 'b'
-    #     assert p3[8] == ':'
-
-    # def test_overflow_write_history(self):
-    #     self.start_transaction()
-    #     plist = [stm_allocate(n) for n in range(16, 256, 8)]
-    #     self.commit_transaction(False)
-    #     #
-    #     for i in range(20):
-    #         self.start_transaction()
-    #         for p in plist:
-    #             stm_write(p)
-    #         self.commit_transaction(False)
+    def test_last_abort__bytes_in_nursery(self):
+        self.start_transaction()
+        stm_allocate(56)
+        self.abort_transaction()
+        assert self.get_stm_thread_local().last_abort__bytes_in_nursery == 56
+        self.start_transaction()
+        assert self.get_stm_thread_local().last_abort__bytes_in_nursery == 56
+        self.commit_transaction()
+        assert self.get_stm_thread_local().last_abort__bytes_in_nursery == 56
+        self.start_transaction()
+        assert self.get_stm_thread_local().last_abort__bytes_in_nursery == 56
+        self.abort_transaction()
+        assert self.get_stm_thread_local().last_abort__bytes_in_nursery == 0


More information about the pypy-commit mailing list