Author: Remi Meier <remi.me...@gmail.com>
Branch: c7
Changeset: r603:6de71cb85ddb
Date: 2014-01-14 12:18 +0100
http://bitbucket.org/pypy/stmgc/changeset/6de71cb85ddb/

Log:    start adding a nursery and redo barriers without the leader-model

diff --git a/c7/core.c b/c7/core.c
--- a/c7/core.c
+++ b/c7/core.c
@@ -18,6 +18,7 @@
 #define NB_THREADS          2
 #define MAP_PAGES_FLAGS     (MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE)
 #define LARGE_OBJECT_WORDS  36
+#define NB_NURSERY_PAGES    1024
 
 #if defined(__i386__) || defined(__x86_64__)
 #  define HAVE_FULL_EXCHANGE_INSN
@@ -42,6 +43,7 @@
     struct stm_list_s *modified_objects;
     struct stm_list_s *new_object_ranges;
     struct alloc_for_size_s alloc[LARGE_OBJECT_WORDS];
+    localchar_t *nursery_current;
 };
 #define _STM_TL2            ((_thread_local2_t *)_STM_TL1)
 
@@ -226,12 +228,20 @@
 
 void _stm_write_slowpath(object_t *obj)
 {
-    maybe_update(CAN_CONFLICT);
-
     _stm_privatize(((uintptr_t)obj) / 4096);
 
+    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)
+        abort();                /* XXX */
+
+    obj->stm_flags &= ~GCFLAG_WRITE_BARRIER;
+    
     stm_read(obj);
-    obj->write_version = _STM_TL1->transaction_write_version;
 
     _STM_TL2->modified_objects = stm_list_append(
         _STM_TL2->modified_objects, obj);
@@ -306,24 +316,29 @@
     assert(size % 8 == 0);
     size_t i = size / 8;
     assert(2 <= i && i < LARGE_OBJECT_WORDS);//XXX
-    alloc_for_size_t *alloc = &_STM_TL2->alloc[i];
 
-    localchar_t *p = alloc->next;
-    alloc->next = p + size;
-    if ((uint16_t)(uintptr_t)p == alloc->stop)
-        p = _stm_alloc_next_page(i);
+    localchar_t *current = _STM_TL2->nursery_current;
+    localchar_t *new_current = current + size;
+    if ((uintptr_t)new_current > FIRST_AFTER_NURSERY_PAGE * 4096) {
+        /* XXX: do minor collection */
+        abort();
+    }
 
-    object_t *result = (object_t *)p;
-    result->write_version = _STM_TL1->transaction_write_version;
+    object_t *result = (object_t *)current;
     return result;
 }
 
 
+
+
+
+
 #define TOTAL_MEMORY          (NB_PAGES * 4096UL * NB_THREADS)
 #define READMARKER_END        ((NB_PAGES * 4096UL) >> 4)
 #define FIRST_OBJECT_PAGE     ((READMARKER_END + 4095) / 4096UL)
 #define READMARKER_START      ((FIRST_OBJECT_PAGE * 4096UL) >> 4)
 #define FIRST_READMARKER_PAGE (READMARKER_START / 4096UL)
+#define FIRST_AFTER_NURSERY_PAGE  (FIRST_OBJECT_PAGE + NB_NURSERY_PAGES)
 
 void stm_setup(void)
 {
@@ -368,9 +383,12 @@
 
         if (i > 0) {
             int res;
-            res = remap_file_pages(thread_base + FIRST_OBJECT_PAGE * 4096UL,
-                                   (NB_PAGES - FIRST_OBJECT_PAGE) * 4096UL,
-                                   0, FIRST_OBJECT_PAGE, 0);
+
+            res = remap_file_pages(
+                    thread_base + FIRST_AFTER_NURSERY_PAGE * 4096UL,
+                    (NB_PAGES - FIRST_AFTER_NURSERY_PAGE) * 4096UL,
+                    0, FIRST_AFTER_NURSERY_PAGE, 0);
+
             if (res != 0) {
                 perror("remap_file_pages");
                 abort();
@@ -379,7 +397,7 @@
     }
 
     num_threads_started = 0;
-    index_page_never_used = FIRST_OBJECT_PAGE;
+    index_page_never_used = FIRST_AFTER_NURSERY_PAGE;
     pending_updates = NULL;
 }
 
diff --git a/c7/core.h b/c7/core.h
--- a/c7/core.h
+++ b/c7/core.h
@@ -29,8 +29,13 @@
    newly allocated objects.
 */
 
+enum {
+    GCFLAG_WRITE_BARRIER = (1 << 0),
+};
+
 struct object_s {
     uint8_t stm_flags;            /* reserved for the STM library */
+    uint8_t stm_write_lock;       /* 1 if writeable by some thread */
     uint32_t header;              /* for the user program -- only write in
                                      newly allocated objects */
 };
@@ -65,7 +70,7 @@
 
 static inline void stm_write(object_t *obj)
 {
-    if (UNLIKELY(obj->write_version != _STM_TL1->transaction_write_version))
+    if (UNLIKELY(obj->stm_flags & GCFLAG_WRITE_BARRIER))
         _stm_write_slowpath(obj);
 }
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to