xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c/sections-1.c (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
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