1 /* { dg-do compile } */
2 /* { dg-options "-fgnu-tm -O" } */
3 
4 extern void usleep (int) __attribute__((transaction_pure));
5 extern int rand(void) __attribute__((pure, transaction_pure));
6 extern int printf (const char *, ...);
7 extern void *malloc (__SIZE_TYPE__) __attribute__((malloc));
8 extern void xyzzy (void * (*)(void *));
9 
10 typedef struct
11 {
12   int id;
13 } parm;
14 
15 int gvar;
16 
hello(void * arg)17 void *hello(void *arg)
18 {
19   parm *p=(parm *)arg;
20   int tmp = p->id;
21   int tmp3;
22   printf ("Thread reads %d.\n", tmp);
23   __transaction_atomic
24     {
25       int tmp2 = gvar;
26       usleep ((int) (10.0*rand()/(10+1.0))/100);
27       gvar = tmp + tmp2;
28       tmp3 = gvar;
29     }
30   printf("tmp3 = %d\n", tmp3);
31   return 0;
32 }
33 
34 int
main()35 main()
36 {
37   int i, n = rand();
38 
39   for (i=0; i<n; i++)
40     xyzzy (hello);
41 
42   return 0;
43 }
44