[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