aboutsummaryrefslogtreecommitdiff
path: root/libitm/testsuite/libitm.c/cancel.c
diff options
context:
space:
mode:
Diffstat (limited to 'libitm/testsuite/libitm.c/cancel.c')
-rw-r--r--libitm/testsuite/libitm.c/cancel.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/libitm/testsuite/libitm.c/cancel.c b/libitm/testsuite/libitm.c/cancel.c
new file mode 100644
index 00000000000..28276db07a1
--- /dev/null
+++ b/libitm/testsuite/libitm.c/cancel.c
@@ -0,0 +1,55 @@
+#include <stdlib.h>
+#include <libitm.h>
+
+unsigned char pp[100];
+
+void __attribute((transaction_may_cancel_outer,noinline)) cancel1()
+{
+ __transaction_cancel [[outer]];
+}
+
+int a, b;
+
+int main()
+{
+ a = b = 0;
+
+ __transaction_atomic {
+ a = 1;
+ __transaction_atomic {
+ b = 1;
+ __transaction_cancel;
+ }
+ }
+ if (a != 1 || b != 0)
+ abort();
+ if (_ITM_inTransaction() != outsideTransaction)
+ abort();
+
+ __transaction_atomic [[outer]] {
+ a = 2;
+ __transaction_atomic {
+ b = 2;
+ __transaction_cancel [[outer]];
+ }
+ }
+ if (a != 1 || b != 0)
+ abort();
+ if (_ITM_inTransaction() != outsideTransaction)
+ abort();
+
+ __transaction_atomic [[outer]] {
+ a = 2;
+ __transaction_atomic {
+ b = 2;
+ __transaction_cancel [[outer]];
+ cancel1();
+ }
+ }
+ if (a != 1 || b != 0)
+ abort();
+ if (_ITM_inTransaction() != outsideTransaction)
+ abort();
+
+ return 0;
+}