OSDN Git Service

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