1*404b540aSrobert /* Test that all sections are touched. */
2*404b540aSrobert
3*404b540aSrobert /* { dg-require-effective-target sync_int_long } */
4*404b540aSrobert
5*404b540aSrobert #include <omp.h>
6*404b540aSrobert #include <string.h>
7*404b540aSrobert #include <assert.h>
8*404b540aSrobert #include "libgomp_g.h"
9*404b540aSrobert
10*404b540aSrobert
11*404b540aSrobert #define N 100
12*404b540aSrobert static int data[N];
13*404b540aSrobert static int NTHR;
14*404b540aSrobert
clean_data(void)15*404b540aSrobert static void clean_data (void)
16*404b540aSrobert {
17*404b540aSrobert memset (data, -1, sizeof (data));
18*404b540aSrobert }
19*404b540aSrobert
test_data(void)20*404b540aSrobert static void test_data (void)
21*404b540aSrobert {
22*404b540aSrobert int i;
23*404b540aSrobert
24*404b540aSrobert for (i = 0; i < N; ++i)
25*404b540aSrobert assert (data[i] != -1);
26*404b540aSrobert }
27*404b540aSrobert
set_data(unsigned i,int val)28*404b540aSrobert static void set_data (unsigned i, int val)
29*404b540aSrobert {
30*404b540aSrobert int old;
31*404b540aSrobert assert (i >= 1 && i <= N);
32*404b540aSrobert old = __sync_lock_test_and_set (data+i-1, val);
33*404b540aSrobert assert (old == -1);
34*404b540aSrobert }
35*404b540aSrobert
36*404b540aSrobert
f_1(void * dummy)37*404b540aSrobert static void f_1 (void *dummy)
38*404b540aSrobert {
39*404b540aSrobert int iam = omp_get_thread_num ();
40*404b540aSrobert unsigned long s;
41*404b540aSrobert
42*404b540aSrobert for (s = GOMP_sections_start (N); s ; s = GOMP_sections_next ())
43*404b540aSrobert set_data (s, iam);
44*404b540aSrobert GOMP_sections_end ();
45*404b540aSrobert }
46*404b540aSrobert
test_1(void)47*404b540aSrobert static void test_1 (void)
48*404b540aSrobert {
49*404b540aSrobert clean_data ();
50*404b540aSrobert GOMP_parallel_start (f_1, NULL, NTHR);
51*404b540aSrobert f_1 (NULL);
52*404b540aSrobert GOMP_parallel_end ();
53*404b540aSrobert test_data ();
54*404b540aSrobert }
55*404b540aSrobert
f_2(void * dummy)56*404b540aSrobert static void f_2 (void *dummy)
57*404b540aSrobert {
58*404b540aSrobert int iam = omp_get_thread_num ();
59*404b540aSrobert unsigned s;
60*404b540aSrobert
61*404b540aSrobert while ((s = GOMP_sections_next ()))
62*404b540aSrobert set_data (s, iam);
63*404b540aSrobert GOMP_sections_end_nowait ();
64*404b540aSrobert }
65*404b540aSrobert
test_2(void)66*404b540aSrobert static void test_2 (void)
67*404b540aSrobert {
68*404b540aSrobert clean_data ();
69*404b540aSrobert GOMP_parallel_sections_start (f_2, NULL, NTHR, N);
70*404b540aSrobert f_2 (NULL);
71*404b540aSrobert GOMP_parallel_end ();
72*404b540aSrobert test_data ();
73*404b540aSrobert }
74*404b540aSrobert
main()75*404b540aSrobert int main()
76*404b540aSrobert {
77*404b540aSrobert omp_set_dynamic (0);
78*404b540aSrobert
79*404b540aSrobert NTHR = 4;
80*404b540aSrobert
81*404b540aSrobert test_1 ();
82*404b540aSrobert test_2 ();
83*404b540aSrobert
84*404b540aSrobert return 0;
85*404b540aSrobert }
86