(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.oacc-c-c++-common/
deep-copy-4.c
       1  #include <assert.h>
       2  #include <stdlib.h>
       3  
       4  #define LIST_LENGTH 10
       5  
       6  struct node
       7  {
       8    struct node *next;
       9    int val;
      10  };
      11  
      12  int
      13  sum_nodes (struct node *head)
      14  {
      15    int i = 0, sum = 0;
      16  
      17  #pragma acc parallel reduction(+:sum) present(head[:1])
      18    {
      19      for (; head != NULL; head = head->next)
      20        sum += head->val;
      21    }
      22  
      23    return sum;
      24  }
      25  
      26  void
      27  insert (struct node *head, int val)
      28  {
      29    struct node *n = (struct node *) malloc (sizeof (struct node));
      30  
      31    if (head->next)
      32      {
      33  #pragma acc exit data detach(head->next)
      34      }
      35  
      36    n->val = val;
      37    n->next = head->next;
      38    head->next = n;
      39  
      40  #pragma acc enter data copyin(n[:1])
      41  #pragma acc enter data attach(head->next)
      42    if (n->next)
      43      {
      44  #pragma acc enter data attach(n->next)
      45      }
      46  }
      47  
      48  void
      49  destroy (struct node *head)
      50  {
      51    while (head->next != NULL)
      52      {
      53  #pragma acc exit data detach(head->next)
      54        struct node * n = head->next;
      55        head->next = n->next;
      56        if (n->next)
      57  	{
      58  #pragma acc exit data detach(n->next)
      59  	}
      60  #pragma acc exit data delete (n[:1])
      61        if (head->next)
      62  	{
      63  #pragma acc enter data attach(head->next)
      64  	}
      65        free (n);
      66      }
      67  }
      68  
      69  int
      70  main ()
      71  {
      72    struct node list = { .next = NULL, .val = 0 };
      73    int i;
      74  
      75  #pragma acc enter data copyin(list)
      76  
      77    for (i = 0; i < LIST_LENGTH; i++)
      78      insert (&list, i + 1);
      79  
      80    assert (sum_nodes (&list) == (LIST_LENGTH * LIST_LENGTH + LIST_LENGTH) / 2);
      81  
      82    destroy (&list);
      83  
      84  #pragma acc exit data delete(list)
      85  
      86    return 0;
      87  }