Author: Armin Rigo <[email protected]>
Branch: c5
Changeset: r566:3c9724af3fb5
Date: 2013-12-19 14:58 +0100
http://bitbucket.org/pypy/stmgc/changeset/3c9724af3fb5/

Log:    in-progress

diff --git a/c5/core.c b/c5/core.c
--- a/c5/core.c
+++ b/c5/core.c
@@ -87,15 +87,15 @@
         char _pad0[CACHE_LINE_SIZE];
     };
     union {
-        uint64_t index_page_never_used;
+        uint64_t volatile index_page_never_used;
         char _pad1[CACHE_LINE_SIZE];
     };
     union {
-        unsigned int next_transaction_version;   /* always EVEN */
+        unsigned int volatile next_transaction_version;   /* always EVEN */
         char _pad2[CACHE_LINE_SIZE];
     };
     union {
-        struct write_history_s *most_recent_committed_transaction;
+        struct write_history_s *volatile most_recent_committed_transaction;
         char _pad3[CACHE_LINE_SIZE];
     };
 };
@@ -166,6 +166,13 @@
     return result;
 }
 
+static struct write_history_s *_reserve_page_write_history(void)
+{
+    struct page_header_s *newpage = _stm_reserve_page();
+    newpage->kind = PGKIND_WRITE_HISTORY;
+    return (struct write_history_s *)(newpage + 1);
+}
+
 
 static uint32_t get_pgoff(struct page_header_s *page)
 {
@@ -216,9 +223,17 @@
         assert(page->pgoff == new_pgoff);
 
         struct write_history_s *cur = stm_local.writes_by_this_transaction;
+        size_t history_size_max = 4096 - (((uintptr_t)cur) & 4095);
+        if (sizeof(*cur) + (cur->nb_updates + 1) * 8 > history_size_max) {
+            /* The buffer would overflow its page.  Allocate a new one. */
+            cur = _reserve_page_write_history();
+            cur->previous_older_transaction =
+                stm_local.writes_by_this_transaction;
+            cur->transaction_version = stm_transaction_version;
+            cur->nb_updates = 0;
+            stm_local.writes_by_this_transaction = cur;
+        }
         uint64_t i = cur->nb_updates++;
-        size_t history_size_max = 4096 - (((uintptr_t)cur) & 4095);
-        assert(sizeof(*cur) + cur->nb_updates * 8 <= history_size_max);//XXX
         cur->updates[i * 2 + 0] = get_local_index(page);
         cur->updates[i * 2 + 1] = new_pgoff;
     }
@@ -487,15 +502,11 @@
         char *next, *page_limit = (char *)cur;
         page_limit += 4096 - (((uintptr_t)page_limit) & 4095);
         next = (char *)(cur + 1) + 8 * cur->nb_updates;
-        if (page_limit - next < sizeof(struct write_history_s) + 8)
-            cur = NULL;
-        else
+        if (page_limit - next >= sizeof(struct write_history_s) + 8)
             cur = (struct write_history_s *)next;
     }
     if (cur == NULL) {
-        struct page_header_s *newpage = _stm_reserve_page();
-        newpage->kind = PGKIND_WRITE_HISTORY;
-        cur = (struct write_history_s *)(newpage + 1);
+        cur = _reserve_page_write_history();
     }
     cur->previous_older_transaction = NULL;
     cur->transaction_version = stm_transaction_version;
@@ -527,6 +538,12 @@
     int conflict = 0;
     //fprintf(stderr, "stm_stop_transaction\n");
 
+    struct write_history_s *cur_head = stm_local.writes_by_this_transaction;
+    struct write_history_s *cur_tail = cur_head;
+    while (cur_tail->previous_older_transaction != NULL) {
+        cur_tail = cur_tail->previous_older_transaction;
+    }
+
     while (1) {
         struct write_history_s *hist = d->most_recent_committed_transaction;
         if (hist != stm_local.base_page_mapping) {
@@ -536,10 +553,9 @@
             else
                 continue;   /* retry from the start of the loop */
         }
-        struct write_history_s *cur = stm_local.writes_by_this_transaction;
-        cur->previous_older_transaction = hist;
+        cur_tail->previous_older_transaction = hist;
         if (__sync_bool_compare_and_swap(&d->most_recent_committed_transaction,
-                                         hist, cur))
+                                         hist, cur_head))
             break;
     }
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to