0
|
1 /* Trivial test of single. */
|
|
2
|
|
3 /* { dg-require-effective-target sync_int_long } */
|
|
4
|
|
5 #include <omp.h>
|
|
6 #include <sys/time.h>
|
|
7 #include <unistd.h>
|
|
8 #include <assert.h>
|
|
9 #include "libgomp_g.h"
|
|
10
|
|
11
|
|
12 static int test;
|
|
13
|
|
14 static void f_nocopy (void *dummy)
|
|
15 {
|
|
16 if (GOMP_single_start ())
|
|
17 {
|
|
18 int iam = omp_get_thread_num ();
|
|
19 int old = __sync_lock_test_and_set (&test, iam);
|
|
20 assert (old == -1);
|
|
21 }
|
|
22 }
|
|
23
|
|
24 static void f_copy (void *dummy)
|
|
25 {
|
|
26 int *x = GOMP_single_copy_start ();
|
|
27 if (x == NULL)
|
|
28 {
|
|
29 int iam = omp_get_thread_num ();
|
|
30 int old = __sync_lock_test_and_set (&test, iam);
|
|
31 assert (old == -1);
|
|
32 GOMP_single_copy_end (&test);
|
|
33 }
|
|
34 else
|
|
35 assert (x == &test);
|
|
36 }
|
|
37
|
|
38 int main()
|
|
39 {
|
|
40 omp_set_dynamic (0);
|
|
41
|
|
42 test = -1;
|
|
43 GOMP_parallel_start (f_nocopy, NULL, 3);
|
|
44 f_nocopy (NULL);
|
|
45 GOMP_parallel_end ();
|
|
46
|
|
47 test = -1;
|
|
48 GOMP_parallel_start (f_copy, NULL, 3);
|
|
49 f_copy (NULL);
|
|
50 GOMP_parallel_end ();
|
|
51
|
|
52 return 0;
|
|
53 }
|