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