| /* { dg-do run } */ |
| /* { dg-options "-pthread" } */ |
| /* { dg-skip-if "PR libitm/51822" { *-*-* } } */ |
| /* Tests static constructors inside of transactional code. */ |
| |
| #include <pthread.h> |
| #include <stdlib.h> |
| |
| int f(int x) __attribute__((noinline,transaction_safe)); |
| int f(int x) |
| { |
| static int y = x; |
| return y*x; |
| } |
| |
| static void *thread (void *) |
| { |
| int bar; |
| __transaction_atomic { bar = f(10); } |
| if (bar != 100) |
| abort(); |
| return 0; |
| } |
| |
| int main() |
| { |
| int bar; |
| |
| // First, initialize y in another thread. |
| pthread_t pt; |
| pthread_create(&pt, NULL, thread, NULL); |
| pthread_join(pt, NULL); |
| |
| // Now y should already be initialized. |
| __transaction_atomic { bar = f(20); } |
| if (bar != 200) |
| abort(); |
| |
| return 0; |
| } |