2 /* { dg-set-target-env-var OMP_CANCELLATION "true" } */
7 struct T
{ struct T
*children
[2]; int val
; };
10 search (struct T
*tree
, int val
, int lvl
)
12 if (tree
== NULL
|| tree
->val
== val
)
16 for (i
= 0; i
< 2; i
++)
17 #pragma omp task shared(ret) if(lvl < 10)
19 struct T
*r
= search (tree
->children
[i
], val
, lvl
+ 1);
22 #pragma omp atomic write
24 #pragma omp cancel taskgroup
32 searchp (struct T
*tree
, int val
)
35 #pragma omp parallel shared(ret) firstprivate (tree, val)
38 ret
= search (tree
, val
, 0);
45 /* Must be power of two minus 1. */
47 struct T
*trees
= (struct T
*) malloc (size
* sizeof (struct T
));
51 for (i
= 0; i
< size
; i
++)
59 trees
[i
].children
[0] = l
== size
? NULL
: &trees
[l
+ (i
- b
) * 2];
60 trees
[i
].children
[1] = l
== size
? NULL
: &trees
[l
+ (i
- b
) * 2 + 1];
62 for (i
= 0; i
< 50; i
++)
64 int v
= random () & size
;
65 if (searchp (&trees
[0], v
) != &trees
[v
])