mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			41 lines
		
	
	
		
			727 B
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			727 B
		
	
	
	
		
			C
		
	
	
	
| /* { 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;
 | |
| }
 |