a.40.1.c 750 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /* { dg-do compile } */
  2. #include <omp.h>
  3. typedef struct
  4. {
  5. int a, b;
  6. omp_nest_lock_t lck;
  7. } pair;
  8. int work1 ();
  9. int work2 ();
  10. int work3 ();
  11. void
  12. incr_a (pair * p, int a)
  13. {
  14. /* Called only from incr_pair, no need to lock. */
  15. p->a += a;
  16. }
  17. void
  18. incr_b (pair * p, int b)
  19. {
  20. /* Called both from incr_pair and elsewhere, */
  21. /* so need a nestable lock. */
  22. omp_set_nest_lock (&p->lck);
  23. p->b += b;
  24. omp_unset_nest_lock (&p->lck);
  25. }
  26. void
  27. incr_pair (pair * p, int a, int b)
  28. {
  29. omp_set_nest_lock (&p->lck);
  30. incr_a (p, a);
  31. incr_b (p, b);
  32. omp_unset_nest_lock (&p->lck);
  33. }
  34. void
  35. a40 (pair * p)
  36. {
  37. #pragma omp parallel sections
  38. {
  39. #pragma omp section
  40. incr_pair (p, work1 (), work2 ());
  41. #pragma omp section
  42. incr_b (p, work3 ());
  43. }
  44. }