OSDN Git Service

2010-04-13 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / libgomp / testsuite / libgomp.c / lock-3.c
1 /* { dg-do run { target *-*-linux* } } */
2
3 #ifndef _GNU_SOURCE
4 #define _GNU_SOURCE 1
5 #endif
6 #include <pthread.h>
7 #include <omp.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10
11 pthread_barrier_t bar;
12 omp_nest_lock_t lock;
13
14 void *tf (void *p)
15 {
16   int l;
17   if (p)
18     {
19       if (omp_test_nest_lock (&lock) != 1)
20         abort ();
21       if (omp_test_nest_lock (&lock) != 2)
22         abort ();
23     }
24   pthread_barrier_wait (&bar);
25   if (!p && omp_test_nest_lock (&lock) != 0)
26     abort ();
27   pthread_barrier_wait (&bar);
28   if (p)
29     {
30       if (omp_test_nest_lock (&lock) != 3)
31         abort ();
32       omp_unset_nest_lock (&lock);
33       omp_unset_nest_lock (&lock);
34       omp_unset_nest_lock (&lock);
35     }
36   pthread_barrier_wait (&bar);
37   if (!p)
38     {
39       if (omp_test_nest_lock (&lock) != 1)
40         abort ();
41       if (omp_test_nest_lock (&lock) != 2)
42         abort ();
43       omp_unset_nest_lock (&lock);
44       omp_unset_nest_lock (&lock);
45     }
46   return NULL;
47 }
48
49 int
50 main (void)
51 {
52   pthread_t th;
53   omp_init_nest_lock (&lock);
54   pthread_barrier_init (&bar, NULL, 2);
55   pthread_create (&th, NULL, tf, NULL);
56   tf ("");
57   pthread_join (th, NULL);
58   omp_destroy_nest_lock (&lock);
59   return 0;
60 }