(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
depend-inoutset-1.c
       1  #include <omp.h>
       2  #include <stdlib.h>
       3  #include <unistd.h>
       4  
       5  int
       6  main ()
       7  {
       8    int a[8] = {};
       9    omp_depend_t d1, d2;
      10    #pragma omp depobj (d1) depend(inoutset: a)
      11    #pragma omp depobj (d2) depend(inout: a)
      12    #pragma omp depobj (d2) update(inoutset)
      13    #pragma omp parallel
      14    {
      15      #pragma omp barrier
      16      #pragma omp master
      17      {
      18      #pragma omp task shared(a) depend(out: a)
      19      {
      20        usleep (5000);
      21        a[0] = 1; a[1] = 2; a[2] = 3; a[3] = 4;
      22      }
      23      /* The above task needs to finish first.  */
      24      #pragma omp task shared(a) depend(in: a)
      25      {
      26        if (a[0] != 1 || a[1] != 2 || a[2] != 3 || a[3] != 4)
      27  	abort ();
      28        usleep (5000);
      29        a[4] = 42;
      30      }
      31      #pragma omp task shared(a) depend(in: a)
      32      {
      33        if (a[0] != 1 || a[1] != 2 || a[2] != 3 || a[3] != 4)
      34  	abort ();
      35        usleep (5000);
      36        a[5] = 43;
      37      }
      38      #pragma omp task shared(a) depend(in: a)
      39      {
      40        if (a[0] != 1 || a[1] != 2 || a[2] != 3 || a[3] != 4)
      41  	abort ();
      42        usleep (5000);
      43        a[6] = 44;
      44      }
      45      #pragma omp task shared(a) depend(in: a)
      46      {
      47        if (a[0] != 1 || a[1] != 2 || a[2] != 3 || a[3] != 4)
      48  	abort ();
      49        usleep (5000);
      50        a[7] = 45;
      51      }
      52      /* The above 4 tasks can be scheduled in any order but need to wait
      53         for the depend(out: a) task.  */
      54      #pragma omp task shared(a) depend(inoutset: a)
      55      {
      56        if (a[4] != 42 || a[5] != 43 || a[6] != 44 || a[7] != 45)
      57  	abort ();
      58        usleep (5000);
      59        a[0] = 42;
      60      }
      61      #pragma omp task shared(a) depend(iterator(i=1:3:2), inoutset: a)
      62      {
      63        if (a[4] != 42 || a[5] != 43 || a[6] != 44 || a[7] != 45)
      64  	abort ();
      65        usleep (5000);
      66        a[1] = 43;
      67      }
      68      #pragma omp task shared(a) depend(depobj: d1)
      69      {
      70        if (a[4] != 42 || a[5] != 43 || a[6] != 44 || a[7] != 45)
      71  	abort ();
      72        usleep (5000);
      73        a[2] = 44;
      74      }
      75      #pragma omp task shared(a) depend(depobj: d2)
      76      {
      77        if (a[4] != 42 || a[5] != 43 || a[6] != 44 || a[7] != 45)
      78  	abort ();
      79        usleep (5000);
      80        a[3] = 45;
      81      }
      82      /* The above 4 tasks can be scheduled in any order but need to wait
      83         for all the above depend(in: a) tasks.  */
      84      #pragma omp task shared(a) depend(in: a)
      85      {
      86        if (a[0] != 42 || a[1] != 43 || a[2] != 44 || a[3] != 45)
      87  	abort ();
      88        usleep (5000);
      89        a[4] = 46;
      90      }
      91      #pragma omp task shared(a) depend(in: a)
      92      {
      93        if (a[0] != 42 || a[1] != 43 || a[2] != 44 || a[3] != 45)
      94  	abort ();
      95        usleep (5000);
      96        a[5] = 47;
      97      }
      98      #pragma omp task shared(a) depend(in: a)
      99      {
     100        if (a[0] != 42 || a[1] != 43 || a[2] != 44 || a[3] != 45)
     101  	abort ();
     102        usleep (5000);
     103        a[6] = 48;
     104      }
     105      #pragma omp task shared(a) depend(in: a)
     106      {
     107        if (a[0] != 42 || a[1] != 43 || a[2] != 44 || a[3] != 45)
     108  	abort ();
     109        usleep (5000);
     110        a[7] = 49;
     111      }
     112      /* The above 4 tasks can be scheduled in any order but need to wait
     113         for all the above depend(inoutset: a),
     114         depend(iterator(i=1:3:2), inoutset: a), depend(depobj: d1) and
     115         depend(depobj: d2) tasks.  */
     116      #pragma omp task shared(a) depend(inoutset: a)
     117      {
     118        if (a[4] != 46|| a[5] != 47 || a[6] != 48 || a[7] != 49)
     119  	abort ();
     120        usleep (5000);
     121        a[0] = 50;
     122      }
     123      /* The above task needs to wait for all the above 4 depend(in: a)
     124         tasks.  */
     125      #pragma omp task shared(a) depend(out: a)
     126      {
     127        if (a[0] != 50 || a[4] != 46|| a[5] != 47 || a[6] != 48 || a[7] != 49)
     128  	abort ();
     129        usleep (5000);
     130        a[0] = 51;
     131      }
     132      /* The above task needs to wait for the above depend(inoutset: a) task.  */
     133      #pragma omp task shared(a) depend(inoutset: a)
     134      {
     135        if (a[0] != 51 || a[4] != 46|| a[5] != 47 || a[6] != 48 || a[7] != 49)
     136  	abort ();
     137        usleep (5000);
     138        a[0] = 52;
     139      }
     140      /* The above task needs to wait for the above depend(out: a) task.  */
     141      #pragma omp task shared(a) depend(mutexinoutset: a)
     142      {
     143        if (a[0] != 52 || a[4] != 46|| a[5] != 47 || a[6] != 48 || a[7] != 49)
     144  	abort ();
     145        usleep (5000);
     146        a[0] = 53;
     147      }
     148      /* The above task needs to wait for the above depend(inoutset: a) task.  */
     149      #pragma omp task shared(a) depend(inoutset: a)
     150      {
     151        if (a[0] != 53 || a[4] != 46|| a[5] != 47 || a[6] != 48 || a[7] != 49)
     152  	abort ();
     153        usleep (5000);
     154        a[0] = 54;
     155      }
     156      /* The above task needs to wait for the above
     157         depend(mutexinoutset: a) task.  */
     158      }
     159    }
     160    if (a[0] != 54 || a[1] != 43 || a[2] != 44 || a[3] != 45
     161        || a[4] != 46|| a[5] != 47 || a[6] != 48 || a[7] != 49)
     162      abort ();
     163    return 0;
     164  }