Tests that new transactions can be started from both transaction_pure and transaction_unsafe code. This also checks proper handling of reentrant nesting in the serial_lock implementation (reentrant in the sense that we go from transactional to nontransactional to transactional code). This test currently does not compile due to a GCC bug (no bug report yet).
OK for branch?
commit c1eafd7cfbdb71dadb3ac5f797fb2a596026f1be Author: Torvald Riegel <trie...@redhat.com> Date: Mon Aug 1 15:43:05 2011 +0200 Test that nested txns started from pure/unsafe code work correctly. * testsuite/libitm.c/reentrant.c: New file. diff --git a/libitm/testsuite/libitm.c/reentrant.c b/libitm/testsuite/libitm.c/reentrant.c new file mode 100644 index 0000000..aeb9a0e --- /dev/null +++ b/libitm/testsuite/libitm.c/reentrant.c @@ -0,0 +1,64 @@ +/* Tests that new transactions can be started from both transaction_pure and + transaction_unsafe code. This also requires proper handling of reentrant + nesting in the serial_lock implementation. */ + +#include <stdlib.h> +#include <pthread.h> +#include <libitm.h> + +int x = 0; + +int __attribute__((transaction_pure)) pure(int i) +{ + __transaction { + x++; + } + if (_ITM_inTransaction() == outsideTransaction) + abort(); + return i+1; +} + +int __attribute__((transaction_unsafe)) unsafe(int i) +{ + if (_ITM_inTransaction() != inIrrevocableTransaction) + abort(); + __transaction { + x++; + } + if (_ITM_inTransaction() != inIrrevocableTransaction) + abort(); + return i+1; +} + +static void *thread (void *dummy __attribute__((unused))) +{ + __transaction { + pure(1); + } + __transaction[[relaxed]] { + unsafe(1); + } + return 0; +} + +int main() +{ + pthread_t pt; + int r = 0; + + __transaction { + r += pure(1) + x; + } + __transaction[[relaxed]] { + r += unsafe(1) + x; + } + if (r != 7) + abort(); + + // Spawn a new thread to check that the serial lock is not held. + pthread_create(&pt, NULL, thread, NULL); + pthread_join(pt, NULL); + if (x != 4) + abort(); + return 0; +}