ctor-4.C 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // { dg-do run }
  2. #include <omp.h>
  3. #include <assert.h>
  4. struct B
  5. {
  6. static int ccount;
  7. static int dcount;
  8. static int ecount;
  9. static B *e_inner;
  10. static B *e_outer;
  11. B();
  12. B(int);
  13. B(const B &);
  14. ~B();
  15. B& operator=(const B &);
  16. void doit();
  17. };
  18. int B::ccount;
  19. int B::dcount;
  20. int B::ecount;
  21. B * B::e_inner;
  22. B * B::e_outer;
  23. B::B(int)
  24. {
  25. e_outer = this;
  26. }
  27. B::B(const B &b)
  28. {
  29. assert (&b == e_outer);
  30. #pragma omp atomic
  31. ccount++;
  32. }
  33. B::~B()
  34. {
  35. #pragma omp atomic
  36. dcount++;
  37. }
  38. B& B::operator= (const B &b)
  39. {
  40. assert (&b == e_inner);
  41. assert (this == e_outer);
  42. #pragma omp atomic
  43. ecount++;
  44. return *this;
  45. }
  46. void B::doit()
  47. {
  48. #pragma omp critical
  49. {
  50. assert (e_inner == 0);
  51. e_inner = this;
  52. }
  53. }
  54. static int nthreads;
  55. void foo()
  56. {
  57. B b(0);
  58. #pragma omp parallel sections firstprivate(b) lastprivate(b)
  59. {
  60. #pragma omp section
  61. nthreads = omp_get_num_threads ();
  62. #pragma omp section
  63. b.doit ();
  64. }
  65. }
  66. int main()
  67. {
  68. omp_set_dynamic (0);
  69. omp_set_num_threads (4);
  70. foo();
  71. assert (B::ecount == 1);
  72. assert (B::ccount == nthreads);
  73. assert (B::dcount == nthreads+1);
  74. return 0;
  75. }