00001
00002
00003 #ifndef _GNU_SOURCE
00004 #define _GNU_SOURCE 1
00005 #endif
00006 #include <pthread.h>
00007 #include <omp.h>
00008 #include <stdio.h>
00009 #include <stdlib.h>
00010
00011 pthread_barrier_t bar;
00012 omp_nest_lock_t lock;
00013
00014 void *tf (void *p)
00015 {
00016 int l;
00017 if (p)
00018 {
00019 if (omp_test_nest_lock (&lock) != 1)
00020 abort ();
00021 if (omp_test_nest_lock (&lock) != 2)
00022 abort ();
00023 }
00024 pthread_barrier_wait (&bar);
00025 if (!p && omp_test_nest_lock (&lock) != 0)
00026 abort ();
00027 pthread_barrier_wait (&bar);
00028 if (p)
00029 {
00030 if (omp_test_nest_lock (&lock) != 3)
00031 abort ();
00032 omp_unset_nest_lock (&lock);
00033 omp_unset_nest_lock (&lock);
00034 omp_unset_nest_lock (&lock);
00035 }
00036 pthread_barrier_wait (&bar);
00037 if (!p)
00038 {
00039 if (omp_test_nest_lock (&lock) != 1)
00040 abort ();
00041 if (omp_test_nest_lock (&lock) != 2)
00042 abort ();
00043 omp_unset_nest_lock (&lock);
00044 omp_unset_nest_lock (&lock);
00045 }
00046 return NULL;
00047 }
00048
00049 int
00050 main (void)
00051 {
00052 pthread_t th;
00053 omp_init_nest_lock (&lock);
00054 pthread_barrier_init (&bar, NULL, 2);
00055 pthread_create (&th, NULL, tf, NULL);
00056 tf ("");
00057 pthread_join (th, NULL);
00058 omp_destroy_nest_lock (&lock);
00059 return 0;
00060 }