mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			49 lines
		
	
	
		
			750 B
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			750 B
		
	
	
	
		
			C
		
	
	
	
| /* { dg-do compile } */
 | |
| 
 | |
| #include <omp.h>
 | |
| typedef struct
 | |
| {
 | |
|   int a, b;
 | |
|   omp_nest_lock_t lck;
 | |
| } pair;
 | |
| int work1 ();
 | |
| int work2 ();
 | |
| int work3 ();
 | |
| void
 | |
| incr_a (pair * p, int a)
 | |
| {
 | |
|   /* Called only from incr_pair, no need to lock. */
 | |
|   p->a += a;
 | |
| }
 | |
| 
 | |
| void
 | |
| incr_b (pair * p, int b)
 | |
| {
 | |
|   /* Called both from incr_pair and elsewhere, */
 | |
|   /* so need a nestable lock. */
 | |
|   omp_set_nest_lock (&p->lck);
 | |
|   p->b += b;
 | |
|   omp_unset_nest_lock (&p->lck);
 | |
| }
 | |
| 
 | |
| void
 | |
| incr_pair (pair * p, int a, int b)
 | |
| {
 | |
|   omp_set_nest_lock (&p->lck);
 | |
|   incr_a (p, a);
 | |
|   incr_b (p, b);
 | |
|   omp_unset_nest_lock (&p->lck);
 | |
| }
 | |
| 
 | |
| void
 | |
| a40 (pair * p)
 | |
| {
 | |
| #pragma omp parallel sections
 | |
|   {
 | |
| #pragma omp section
 | |
|     incr_pair (p, work1 (), work2 ());
 | |
| #pragma omp section
 | |
|     incr_b (p, work3 ());
 | |
|   }
 | |
| }
 |