[pypy-commit] stmgc c8-gil-like: hg merge default

arigo noreply at buildbot.pypy.org
Tue Jun 9 17:13:07 CEST 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: c8-gil-like
Changeset: r1793:f85a069a561e
Date: 2015-06-07 11:57 +0200
http://bitbucket.org/pypy/stmgc/changeset/f85a069a561e/

Log:	hg merge default

diff --git a/c8/stm/core.h b/c8/stm/core.h
--- a/c8/stm/core.h
+++ b/c8/stm/core.h
@@ -170,6 +170,10 @@
     TS_INEVITABLE,
 };
 
+#define in_transaction(tl)                                              \
+    (get_segment((tl)->last_associated_segment_num)->running_thread == (tl))
+
+
 /* Commit Log things */
 struct stm_undo_s {
   union {
diff --git a/c8/stm/extra.c b/c8/stm/extra.c
--- a/c8/stm/extra.c
+++ b/c8/stm/extra.c
@@ -8,7 +8,7 @@
 {
     dprintf(("register_callbacks: tl=%p key=%p callback=%p index=%ld\n",
              tl, key, callback, index));
-    if (tl->associated_segment_num == -1) {
+    if (!in_transaction(tl)) {
         /* check that the provided thread-local is really running a
            transaction, and do nothing otherwise. */
         dprintf(("  NOT IN TRANSACTION\n"));
diff --git a/c8/stm/forksupport.c b/c8/stm/forksupport.c
--- a/c8/stm/forksupport.c
+++ b/c8/stm/forksupport.c
@@ -41,6 +41,7 @@
     bool was_in_transaction = _stm_in_transaction(this_tl);
     if (!was_in_transaction)
         stm_start_transaction(this_tl);
+    assert(in_transaction(this_tl));
 
     stm_become_inevitable(this_tl, "fork");
     /* Note that the line above can still fail and abort, which should
@@ -83,7 +84,8 @@
     struct stm_priv_segment_info_s *pr = get_priv_segment(i);
     stm_thread_local_t *tl = pr->pub.running_thread;
     dprintf(("forksupport_child: abort in seg%ld\n", i));
-    assert(tl->associated_segment_num == i);
+    assert(tl->last_associated_segment_num == i);
+    assert(in_transaction(tl));
     assert(pr->transaction_state != TS_INEVITABLE);
     set_gs_register(get_segment_base(i));
     assert(STM_SEGMENT->segment_num == i);
@@ -150,7 +152,7 @@
 
     /* Restore a few things: the new pthread_self(), and the %gs
        register */
-    int segnum = fork_this_tl->associated_segment_num;
+    int segnum = fork_this_tl->last_associated_segment_num;
     assert(1 <= segnum && segnum < NB_SEGMENTS);
     *_get_cpth(fork_this_tl) = pthread_self();
     set_gs_register(get_segment_base(segnum));
diff --git a/c8/stm/setup.c b/c8/stm/setup.c
--- a/c8/stm/setup.c
+++ b/c8/stm/setup.c
@@ -244,7 +244,6 @@
     /* assign numbers consecutively, but that's for tests; we could also
        assign the same number to all of them and they would get their own
        numbers automatically. */
-    tl->associated_segment_num = -1;
     tl->last_associated_segment_num = num + 1;
     tl->thread_local_counter = ++thread_local_counters;
     *_get_cpth(tl) = pthread_self();
diff --git a/c8/stm/sync.c b/c8/stm/sync.c
--- a/c8/stm/sync.c
+++ b/c8/stm/sync.c
@@ -176,8 +176,10 @@
     sync_ctl.in_use1[num+1] = 1;
     assert(STM_SEGMENT->segment_num == num+1);
     assert(STM_SEGMENT->running_thread == NULL);
-    tl->associated_segment_num = tl->last_associated_segment_num;
+    assert(tl->last_associated_segment_num == STM_SEGMENT->segment_num);
+    assert(!in_transaction(tl));
     STM_SEGMENT->running_thread = tl;
+    assert(in_transaction(tl));
     return true;
 }
 
@@ -188,9 +190,10 @@
     cond_signal(C_SEGMENT_FREE);
 
     assert(STM_SEGMENT->running_thread == tl);
-    assert(tl->associated_segment_num == tl->last_associated_segment_num);
-    tl->associated_segment_num = -1;
+    assert(tl->last_associated_segment_num == STM_SEGMENT->segment_num);
+    assert(in_transaction(tl));
     STM_SEGMENT->running_thread = NULL;
+    assert(!in_transaction(tl));
 
     assert(sync_ctl.in_use1[tl->last_associated_segment_num] == 1);
     sync_ctl.in_use1[tl->last_associated_segment_num] = 0;
@@ -204,22 +207,15 @@
 
 bool _stm_in_transaction(stm_thread_local_t *tl)
 {
-    if (tl->associated_segment_num == -1) {
-        return false;
-    }
-    else {
-        int num = tl->associated_segment_num;
-        OPT_ASSERT(1 <= num && num < NB_SEGMENTS);
-        OPT_ASSERT(num == tl->last_associated_segment_num);
-        OPT_ASSERT(get_segment(num)->running_thread == tl);
-        return true;
-    }
+    int num = tl->last_associated_segment_num;
+    OPT_ASSERT(1 <= num && num < NB_SEGMENTS);
+    return in_transaction(tl);
 }
 
 void _stm_test_switch(stm_thread_local_t *tl)
 {
     assert(_stm_in_transaction(tl));
-    set_gs_register(get_segment_base(tl->associated_segment_num));
+    set_gs_register(get_segment_base(tl->last_associated_segment_num));
     assert(STM_SEGMENT->running_thread == tl);
     exec_local_finalizers();
 }
diff --git a/c8/stmgc.h b/c8/stmgc.h
--- a/c8/stmgc.h
+++ b/c8/stmgc.h
@@ -69,8 +69,7 @@
        (this field is 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;
-    int last_associated_segment_num;
+    int last_associated_segment_num;   /* always a valid seg num */
     int thread_local_counter;
     struct stm_thread_local_s *prev, *next;
     void *creating_pthread[2];
diff --git a/c8/test/support.py b/c8/test/support.py
--- a/c8/test/support.py
+++ b/c8/test/support.py
@@ -29,7 +29,6 @@
     char *mem_clear_on_abort;
     size_t mem_bytes_to_clear_on_abort;
     long last_abort__bytes_in_nursery;
-    int associated_segment_num;
     int last_associated_segment_num;
     struct stm_thread_local_s *prev, *next;
     void *creating_pthread[2];
@@ -798,8 +797,8 @@
         seen = set()
         for tl1 in self.tls:
             if lib._stm_in_transaction(tl1):
-                assert tl1.associated_segment_num not in seen
-                seen.add(tl1.associated_segment_num)
+                assert tl1.last_associated_segment_num not in seen
+                seen.add(tl1.last_associated_segment_num)
 
     def commit_transaction(self):
         tl = self.tls[self.current_thread]
diff --git a/c8/test/test_finalizer.py b/c8/test/test_finalizer.py
--- a/c8/test/test_finalizer.py
+++ b/c8/test/test_finalizer.py
@@ -13,9 +13,10 @@
             segnum = lib.current_segment_num()
             tlnum = '?'
             for n, tl in enumerate(self.tls):
-                if tl.associated_segment_num == segnum:
-                    tlnum = n
-                    break
+                if lib._stm_in_transaction(tl):
+                    if tl.last_associated_segment_num == segnum:
+                        tlnum = n
+                        break
             self.light_finalizers_called.append((obj, tlnum))
         self.light_finalizers_called = []
         lib.stmcb_light_finalizer = light_finalizer


More information about the pypy-commit mailing list