1/* { dg-do run { target *-*-linux* *-*-gnu* *-*-freebsd* } } */ 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 11pthread_barrier_t bar; 12omp_nest_lock_t lock; 13 14void *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 49int 50main (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} 61