1 /* Trivial test of ordered.  */
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
12 static int next;
13 static int CHUNK, NTHR;
14 
15 static void clean_data (void)
16 {
17   next = 0;
18 }
19 
20 static void set_data (long i)
21 {
22   int n = __sync_fetch_and_add (&next, 1);
23   assert (n == i);
24 }
25 
26 
27 #define TMPL_1(sched)							\
28 static void f_##sched##_1 (void *dummy)					\
29 {									\
30   long s0, e0, i;							\
31   if (GOMP_loop_ordered_##sched##_start (0, N, 1, CHUNK, &s0, &e0))	\
32     do									\
33       {									\
34 	for (i = s0; i < e0; ++i)					\
35 	  {								\
36 	    GOMP_ordered_start ();					\
37 	    set_data (i);						\
38 	    GOMP_ordered_end ();					\
39 	  }								\
40       }									\
41     while (GOMP_loop_ordered_##sched##_next (&s0, &e0));		\
42   GOMP_loop_end ();							\
43 }									\
44 static void t_##sched##_1 (void)					\
45 {									\
46   clean_data ();							\
47   GOMP_parallel_start (f_##sched##_1, NULL, NTHR);			\
48   f_##sched##_1 (NULL);							\
49   GOMP_parallel_end ();							\
50 }
51 
52 TMPL_1(static)
53 TMPL_1(dynamic)
54 TMPL_1(guided)
55 
56 static void test (void)
57 {
58   t_static_1 ();
59   t_dynamic_1 ();
60   t_guided_1 ();
61 }
62 
63 int main()
64 {
65   omp_set_dynamic (0);
66 
67   NTHR = 4;
68 
69   CHUNK = 1;
70   test ();
71 
72   CHUNK = 5;
73   test ();
74 
75   CHUNK = 7;
76   test ();
77 
78   CHUNK = 0;
79   t_static_1 ();
80 
81   return 0;
82 }
83