[pypy-commit] stmgc rewind_setjmp: Progress

arigo noreply at buildbot.pypy.org
Sat Aug 9 17:18:41 CEST 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: rewind_setjmp
Changeset: r1279:c872897a138f
Date: 2014-08-09 17:18 +0200
http://bitbucket.org/pypy/stmgc/changeset/c872897a138f/

Log:	Progress

diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -1003,6 +1003,14 @@
 
 #ifdef STM_NO_AUTOMATIC_SETJMP
 void _test_run_abort(stm_thread_local_t *tl) __attribute__((noreturn));
+int stm_is_inevitable(void)
+{
+    switch (STM_PSEGMENT->transaction_state) {
+    case TS_REGULAR: return 0;
+    case TS_INEVITABLE: return 1;
+    default: abort();
+    }
+}
 #endif
 
 static void abort_with_mutex(void)
diff --git a/c7/stm/rewind_setjmp.h b/c7/stm/rewind_setjmp.h
--- a/c7/stm/rewind_setjmp.h
+++ b/c7/stm/rewind_setjmp.h
@@ -77,4 +77,6 @@
 void _rewind_jmp_copy_stack_slice(rewind_jmp_thread *);
 void _rewind_jmp_free_stack_slices(rewind_jmp_thread *);
 
+#define rewind_jmp_armed(rjthread)   ((rjthread)->moved_off_base != 0)
+
 #endif
diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -350,16 +350,18 @@
 
 /* Turn the current transaction inevitable.
    The stm_become_inevitable() itself may still abort. */
+#ifdef STM_NO_AUTOMATIC_SETJMP
+int stm_is_inevitable(void);
+#else
+static inline int stm_is_inevitable(void) {
+    return !rewind_jmp_armed(STM_SEGMENT->running_thread->rjthread); 
+}
+#endif
 static inline void stm_become_inevitable(stm_thread_local_t *tl,
                                          const char* msg) {
-    assert(0);/* XXX
     assert(STM_SEGMENT->running_thread == tl);
-    if (STM_SEGMENT->jmpbuf_ptr != NULL)
-        _stm_become_inevitable(msg);*/
-}
-static inline int stm_is_inevitable(void) {
-    return 0;  /* XXX
-    return (STM_SEGMENT->jmpbuf_ptr == NULL); */
+    if (!stm_is_inevitable())
+        _stm_become_inevitable(msg);
 }
 
 /* Forces a safe-point if needed.  Normally not needed: this is
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
@@ -369,6 +369,7 @@
 
     def test_inevitable_transaction_has_priority(self):
         self.start_transaction()
+        assert lib.stm_is_inevitable() == 0
         lp1 = stm_allocate(16)
         stm_set_char(lp1, 'a')
         self.push_root(lp1)


More information about the pypy-commit mailing list