1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- /* { dg-do run } */
- /* { dg-options "-pthread" } */
- /* 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_atomic {
- x++;
- }
- if (_ITM_inTransaction() == outsideTransaction)
- abort();
- return i+1;
- }
- int __attribute__((transaction_unsafe)) unsafe(int i)
- {
- if (_ITM_inTransaction() != inIrrevocableTransaction)
- abort();
- __transaction_atomic {
- x++;
- }
- if (_ITM_inTransaction() != inIrrevocableTransaction)
- abort();
- return i+1;
- }
- static void *thread (void *dummy __attribute__((unused)))
- {
- __transaction_atomic {
- pure(x);
- }
- __transaction_relaxed {
- unsafe(1);
- }
- return 0;
- }
- int main()
- {
- pthread_t pt;
- int r = 0;
- __transaction_atomic {
- 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;
- }
|