Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r77:9baaba7aa86d
Date: 2013-06-06 13:55 +0200
http://bitbucket.org/pypy/stmgc/changeset/9baaba7aa86d/

Log:    Move the code to a new directory "c4" as I need it.

diff --git a/c3/atomic_ops.h b/c4/atomic_ops.h
rename from c3/atomic_ops.h
rename to c4/atomic_ops.h
diff --git a/c3/dbgmem.c b/c4/dbgmem.c
rename from c3/dbgmem.c
rename to c4/dbgmem.c
diff --git a/c3/dbgmem.h b/c4/dbgmem.h
rename from c3/dbgmem.h
rename to c4/dbgmem.h
diff --git a/c3/doc-objects.txt b/c4/doc-objects.txt
rename from c3/doc-objects.txt
rename to c4/doc-objects.txt
diff --git a/c3/doc-stmgc.txt b/c4/doc-stmgc.txt
rename from c3/doc-stmgc.txt
rename to c4/doc-stmgc.txt
diff --git a/c3/et.c b/c4/et.c
rename from c3/et.c
rename to c4/et.c
--- a/c3/et.c
+++ b/c4/et.c
@@ -192,10 +192,13 @@
     }
   else
     {
-      abort();   // stealing
+      /* stealing */
+      fprintf(stderr, "read_barrier: %p -> stealing %p...", G, (gcptr)v);
+      abort();
     }
 }
 
+#if 0
 static gcptr _latest_gcptr(gcptr R)
 {
   /* don't use, for tests only */
@@ -270,6 +273,7 @@
       return obj;
     }
 }
+#endif
 
 #if 0
 void *stm_DirectReadBarrierFromR(void *G1, void *R_Container1, size_t offset)
@@ -294,6 +298,14 @@
 #endif
 }
 
+gcptr stmgc_duplicate(gcptr P)
+{
+  size_t size = stmcb_size(P);
+  gcptr L = stm_malloc(size);
+  memcpy(L, P, size);
+  return L;
+}
+
 static gcptr LocalizeProtected(struct tx_descriptor *d, gcptr P)
 {
   gcptr B;
@@ -307,7 +319,7 @@
   if (P->h_revision & 1)
     {
       /* does not have a backup yet */
-      B = stmgc_duplicate(P, 0);
+      B = stmgc_duplicate(P);
       B->h_tid |= GCFLAG_BACKUP_COPY;
     }
   else
@@ -338,7 +350,7 @@
   R->h_tid |= GCFLAG_PUBLIC_TO_PRIVATE;
 
  not_found:;
-  gcptr L = stmgc_duplicate(R, 0);
+  gcptr L = stmgc_duplicate(R);
   assert(!(L->h_tid & GCFLAG_BACKUP_COPY));
   assert(!(L->h_tid & GCFLAG_STOLEN));
   assert(!(L->h_tid & GCFLAG_STUB));
@@ -556,7 +568,7 @@
 
   gcptrlist_clear(&d->list_of_read_objects);
   g2l_clear(&d->private_to_backup);
-  stmgc_abort_transaction(d);
+  abort();//stmgc_abort_transaction(d);
 
   fprintf(stderr,
           "\n"
@@ -620,7 +632,7 @@
   }
   assert(d->list_of_read_objects.size == 0);
   assert(!g2l_any_entry(&d->private_to_backup));
-  stmgc_start_transaction(d);
+  assert(!g2l_any_entry(&d->public_to_private));
 
   d->count_reads = 1;
   fxcache_clear(&d->recent_reads_cache);
@@ -750,10 +762,10 @@
       gcptr R = item->addr;
       revision_t v = (revision_t)item->val;
 
+      assert(R->h_tid & GCFLAG_PUBLIC);
       assert(R->h_tid & GCFLAG_PUBLIC_TO_PRIVATE);
       assert(!(R->h_tid & GCFLAG_NURSERY_MOVED));
       assert(!(R->h_tid & GCFLAG_STOLEN));
-      assert(!is_young(R));
       assert(R->h_revision != localrev);
 
       /* XXX compactify and don't leak! */
@@ -773,6 +785,7 @@
 #endif
       ACCESS_ONCE(R->h_revision) = w;
 
+#if 0
       if (R->h_tid & GCFLAG_PREBUILT_ORIGINAL)
         {
           /* cannot possibly get here more than once for a given value of R */
@@ -781,12 +794,14 @@
           pthread_mutex_unlock(&mutex_prebuilt_gcroots);
           /*mark*/
         }
+#endif
 
     } G2L_LOOP_END;
 
   g2l_clear(&d->public_to_private);
 }
 
+#if 0
 void UpdateProtectedChainHeads(struct tx_descriptor *d, revision_t cur_time,
                                revision_t localrev)
 {
@@ -805,6 +820,7 @@
       L->h_revision = new_revision;
     }
 }
+#endif
 
 void TurnPrivateWithBackupToProtected(struct tx_descriptor *d,
                                       revision_t cur_time)
@@ -829,7 +845,7 @@
   struct tx_descriptor *d = thread_descriptor;
   assert(d->active >= 1);
 
-  stmgc_stop_transaction(d);
+  spinlock_acquire(d->collection_lock, 'C');  /* committing */
   AcquireLocks(d);
 
   if (is_inevitable(d))
@@ -851,10 +867,10 @@
           if (cur_time & 1)
             {                    // there is another inevitable transaction
               CancelLocks(d);
-              stmgc_suspend_commit_transaction(d);
+              spinlock_release(d->collection_lock);
               inev_mutex_acquire();   // wait until released
               inev_mutex_release();
-              stmgc_stop_transaction(d);
+              spinlock_acquire(d->collection_lock, 'C');
               AcquireLocks(d);
               continue;
             }
@@ -879,8 +895,8 @@
   TurnPrivateWithBackupToProtected(d, cur_time);
 
   revision_t localrev = stm_private_rev_num;
-  UpdateProtectedChainHeads(d, cur_time, localrev);
-  smp_wmb();
+  //UpdateProtectedChainHeads(d, cur_time, localrev);
+  //smp_wmb();
 
   revision_t newrev = -(cur_time + 1);
   assert(newrev & 1);
@@ -890,7 +906,7 @@
 
   UpdateChainHeads(d, cur_time, localrev);
 
-  stmgc_committed_transaction(d);
+  spinlock_release(d->collection_lock);
   d->num_commits++;
   d->active = 0;
   stm_stop_sharedlock();
@@ -1107,6 +1123,7 @@
 
     thread_descriptor = NULL;
 
+    g2l_delete(&d->public_to_private);
     g2l_delete(&d->private_to_backup);
     gcptrlist_delete(&d->list_of_read_objects);
     gcptrlist_delete(&d->abortinfo);
diff --git a/c3/et.h b/c4/et.h
rename from c3/et.h
rename to c4/et.h
--- a/c3/et.h
+++ b/c4/et.h
@@ -13,6 +13,7 @@
 
 #define LOCKED  ((INTPTR_MAX - 0xffff) | 1)
 
+#define WORD                sizeof(gcptr)
 #define HANDLE_BLOCK_SIZE   (2 * WORD)
 
 /* Description of the flags
@@ -100,11 +101,13 @@
 #define SPINLOOP_REASONS      4
 
 struct tx_descriptor {
-  NURSERY_FIELDS_DECL
-  local_gcpages_t *local_gcpages;
   jmp_buf *setjmp_buf;
   revision_t start_time;
   revision_t my_lock;
+  revision_t collection_lock;
+  gcptr *shadowstack;
+  gcptr **shadowstack_end_ref;
+
   long atomic;   /* 0 = not atomic, > 0 atomic */
   unsigned long count_reads;
   unsigned long reads_size_limit;        /* see should_break_tr. */
@@ -119,6 +122,7 @@
   struct GcPtrList list_of_read_objects;
   struct GcPtrList abortinfo;
   struct G2L private_to_backup;
+  struct G2L public_to_private;
   char *longest_abort_info;
   long long longest_abort_info_time;
   struct FXCache recent_reads_cache;
diff --git a/c3/fprintcolor.c b/c4/fprintcolor.c
rename from c3/fprintcolor.c
rename to c4/fprintcolor.c
diff --git a/c3/fprintcolor.h b/c4/fprintcolor.h
rename from c3/fprintcolor.h
rename to c4/fprintcolor.h
diff --git a/c3/lists.c b/c4/lists.c
rename from c3/lists.c
rename to c4/lists.c
diff --git a/c3/lists.h b/c4/lists.h
rename from c3/lists.h
rename to c4/lists.h
diff --git a/c3/stmgc.h b/c4/stmgc.h
rename from c3/stmgc.h
rename to c4/stmgc.h
diff --git a/c3/stmimpl.h b/c4/stmimpl.h
rename from c3/stmimpl.h
rename to c4/stmimpl.h
--- a/c3/stmimpl.h
+++ b/c4/stmimpl.h
@@ -30,8 +30,6 @@
 #include "fprintcolor.h"
 #include "lists.h"
 #include "dbgmem.h"
-#include "nursery.h"
-#include "gcpage.h"
 #include "et.h"
 #include "stmsync.h"
 
diff --git a/c3/stmsync.c b/c4/stmsync.c
rename from c3/stmsync.c
rename to c4/stmsync.c
--- a/c3/stmsync.c
+++ b/c4/stmsync.c
@@ -59,19 +59,19 @@
 {
     int r = DescriptorInit();
     assert(r == 1);
-    stmgc_init_tls();
+    //stmgc_init_tls();
     init_shadowstack();
-    stmgcpage_init_tls();
+    //stmgcpage_init_tls();
     BeginInevitableTransaction();
 }
 
 void stm_finalize(void)
 {
-    stmgc_minor_collect();   /* force everything out of the nursery */
+    //stmgc_minor_collect();   /* force everything out of the nursery */
     CommitTransaction();
-    stmgcpage_done_tls();
+    //stmgcpage_done_tls();
     done_shadowstack();
-    stmgc_done_tls();
+    //stmgc_done_tls();
     DescriptorDone();
 }
 
@@ -95,18 +95,16 @@
 
 gcptr stm_allocate(size_t size, unsigned long tid)
 {
-    gcptr result = stm_allocate_object_of_size(size);
+    gcptr result = stm_malloc(size);
     assert(tid == (tid & STM_USER_TID_MASK));
     result->h_tid = tid;
+    result->h_revision = stm_private_rev_num;
     return result;
 }
 
 gcptr _stm_allocate_old(size_t size, unsigned long tid)
 {
-    gcptr result = _stm_allocate_object_of_size_old(size);
-    assert(tid == (tid & STM_USER_TID_MASK));
-    result->h_tid = tid | GCFLAG_OLD;
-    return result;
+    abort();
 }
 
 /************************************************************/
@@ -237,12 +235,12 @@
 {
     int err = pthread_rwlock_rdlock(&rwlock_shared);
     assert(err == 0);
-    assert(stmgc_nursery_hiding(thread_descriptor, 0));
+    //assert(stmgc_nursery_hiding(thread_descriptor, 0));
 }
 
 void stm_stop_sharedlock(void)
 {
-    assert(stmgc_nursery_hiding(thread_descriptor, 1));
+    //assert(stmgc_nursery_hiding(thread_descriptor, 1));
     int err = pthread_rwlock_unlock(&rwlock_shared);
     assert(err == 0);
 }
@@ -303,3 +301,15 @@
        which takes priority here */
     stm_start_sharedlock();
 }
+
+/************************************************************/
+
+void stm_clear_between_tests(void)
+{
+    fprintf(stderr, "\n"
+            "===============================================================\n"
+            "========================[  START  ]============================\n"
+            "===============================================================\n"
+            "\n");
+    //gcptrlist_clear(&stm_prebuilt_gcroots);
+}
diff --git a/c3/stmsync.h b/c4/stmsync.h
rename from c3/stmsync.h
rename to c4/stmsync.h
--- a/c3/stmsync.h
+++ b/c4/stmsync.h
@@ -11,4 +11,6 @@
 
 void stm_possible_safe_point(void);
 
+void stm_clear_between_tests(void);
+
 #endif
diff --git a/c3/test/support.py b/c4/test/support.py
rename from c3/test/support.py
rename to c4/test/support.py
--- a/c3/test/support.py
+++ b/c4/test/support.py
@@ -5,11 +5,11 @@
 parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 
 header_files = [os.path.join(parent_dir, _n) for _n in
-                "et.h lists.h nursery.h gcpage.h "
+                "et.h lists.h "
                 "stmsync.h dbgmem.h fprintcolor.h "
                 "stmgc.h stmimpl.h atomic_ops.h".split()]
 source_files = [os.path.join(parent_dir, _n) for _n in
-                "et.c lists.c nursery.c gcpage.c "
+                "et.c lists.c "
                 "stmsync.c dbgmem.c fprintcolor.c".split()]
 
 _pycache_ = os.path.join(parent_dir, 'test', '__pycache__')
@@ -40,7 +40,7 @@
     #define PREBUILT_FLAGS         ...
     #define PREBUILT_REVISION      ...
 
-    gcptr stm_allocate_object_of_size(size_t size);
+    //gcptr stm_allocate_object_of_size(size_t size);
     gcptr stm_allocate(size_t size, unsigned long tid);
     void stm_push_root(gcptr);
     gcptr stm_pop_root(void);
@@ -55,15 +55,15 @@
     void stm_set_transaction_length(long length_max);
 
     /* extra non-public code */
-    gcptr stmgcpage_malloc(size_t size);
-    void stmgcpage_free(gcptr obj);
-    long stmgcpage_count(int quantity);
-    void stmgcpage_possibly_major_collect(int);
+    //gcptr stmgcpage_malloc(size_t size);
+    //void stmgcpage_free(gcptr obj);
+    //long stmgcpage_count(int quantity);
+    //void stmgcpage_possibly_major_collect(int);
     revision_t stm_global_cur_time(void);
-    void stmgcpage_add_prebuilt_root(gcptr);
+    //void stmgcpage_add_prebuilt_root(gcptr);
     void stm_clear_between_tests(void);
-    void stmgc_minor_collect(void);
-    gcptr _stm_nonrecord_barrier(gcptr, int *);
+    //void stmgc_minor_collect(void);
+    //gcptr _stm_nonrecord_barrier(gcptr, int *);
     int stm_dbgmem_is_active(void *p, int allow_outside);
     void stm_start_sharedlock(void);
     void stm_stop_sharedlock(void);
@@ -86,8 +86,8 @@
     revision_t get_start_time(void);
     revision_t get_my_lock(void);
 
-    gcptr *addr_of_thread_local(void);
-    int in_nursery(gcptr);
+    //gcptr *addr_of_thread_local(void);
+    //int in_nursery(gcptr);
     void stm_initialize_tests(int max_aborts);
 
     /* some constants normally private that are useful in the tests */
@@ -106,22 +106,20 @@
     #define GCFLAG_STOLEN            ...
     #define GCFLAG_STUB              ...
     #define ABRT_MANUAL              ...
-    typedef struct { ...; } page_header_t;
+    //typedef struct { ...; } page_header_t;
 ''')
 
 lib = ffi.verify(r'''
     #include "stmgc.h"
     #include "stmimpl.h"
 
-    extern gcptr stmgcpage_malloc(size_t size);
-    extern void stmgcpage_free(gcptr obj);
-    extern long stmgcpage_count(int quantity);
-    extern void stmgcpage_possibly_major_collect(int);
+    //extern gcptr stmgcpage_malloc(size_t size);
+    //extern void stmgcpage_free(gcptr obj);
+    //extern long stmgcpage_count(int quantity);
+    //extern void stmgcpage_possibly_major_collect(int);
     extern revision_t stm_global_cur_time(void);
-    extern void stmgcpage_add_prebuilt_root(gcptr);
-    extern void stm_clear_between_tests(void);
+    //extern void stmgcpage_add_prebuilt_root(gcptr);
     extern revision_t get_private_rev_num(void);
-    extern local_gcpages_t *stm_local_gcpages(void);
 
     int gettid(gcptr obj)
     {
@@ -214,17 +212,17 @@
         return thread_descriptor->my_lock;
     }
 
-    gcptr *addr_of_thread_local(void)
+    /*gcptr *addr_of_thread_local(void)
     {
         return &stm_thread_local_obj;
-    }
+    }*/
 
-    int in_nursery(gcptr obj)
+    /*int in_nursery(gcptr obj)
     {
         assert(stm_dbgmem_is_active(obj, 1));
         struct tx_descriptor *d = thread_descriptor;
         return (d->nursery <= (char*)obj && ((char*)obj) < d->nursery_end);
-    }
+    }*/
 
     void stm_initialize_tests(int max_aborts)
     {
@@ -275,7 +273,7 @@
 
 HDR = ffi.sizeof("struct stm_object_s")
 WORD = lib.WORD
-PAGE_ROOM = lib.GC_PAGE_SIZE - ffi.sizeof("page_header_t")
+#PAGE_ROOM = lib.GC_PAGE_SIZE - ffi.sizeof("page_header_t")
 for name in lib.__dict__:
     if name.startswith('GCFLAG_') or name.startswith('PREBUILT_'):
         globals()[name] = getattr(lib, name)
@@ -416,7 +414,7 @@
     lib.settid(p, 42 + size)
     return p
 
-ofree = lib.stmgcpage_free
+#ofree = lib.stmgcpage_free
 
 def oalloc_refs(nrefs):
     "Allocate an 'old' object, i.e. outside any nursery, with nrefs pointers"
diff --git a/c3/test/test_et.py b/c4/test/test_et.py
rename from c3/test/test_et.py
rename to c4/test/test_et.py
--- a/c3/test/test_et.py
+++ b/c4/test/test_et.py
@@ -223,3 +223,15 @@
     p4 = lib.stm_read_barrier(p)
     assert p4 == p2
     assert list_of_read_objects() == [p2]
+
+def test_stealing_protected_without_backup():
+    p = palloc(HDR + WORD)
+    def f1(r):
+        lib.setlong(p, 0, 2782172)
+        lib.stm_commit_transaction()
+        lib.stm_begin_inevitable_transaction()
+        r.set(2)
+    def f2(r):
+        r.wait(2)
+        assert lib.getlong(p, 0) == 2782172
+    run_parallel(f1, f2)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to