1/* { dg-do run } */
2
3#include <pthread.h>
4#include <stdio.h>
5#include <stdlib.h>
6#include <errno.h>
7#include <ctype.h>
8#include <openacc.h>
9
10unsigned char **x;
11void **d_x;
12const int N = 32;
13const int NTHREADS = 32;
14
15static void *
16test (void *arg)
17{
18  int i;
19  int tid;
20  unsigned char *p;
21  int devnum;
22
23  tid = (int) (long) arg;
24
25  devnum = acc_get_device_num (acc_device_nvidia);
26  acc_set_device_num (devnum, acc_device_nvidia);
27
28  if (acc_get_current_cuda_context () == NULL)
29    abort ();
30
31  acc_copyout (x[tid], N);
32
33  p = x[tid];
34
35  for (i = 0; i < N; i++)
36    {
37      if (p[i] != i)
38	abort ();
39    }
40
41  return 0;
42}
43
44int
45main (int argc, char **argv)
46{
47  int i;
48  pthread_attr_t attr;
49  pthread_t *tid;
50  unsigned char *p;
51
52  if (acc_get_num_devices (acc_device_nvidia) == 0)
53    return 0;
54
55  acc_init (acc_device_nvidia);
56
57  x = (unsigned char **) malloc (NTHREADS * N);
58  d_x = (void **) malloc (NTHREADS * N);
59
60  for (i = 0; i < N; i++)
61    {
62      int j;
63
64      p = (unsigned char *) malloc (N);
65
66      x[i] = p;
67
68      for (j = 0; j < N; j++)
69	{
70	  p[j] = j;
71	}
72
73      d_x[i] = acc_copyin (p, N);
74    }
75
76  if (pthread_attr_init (&attr) != 0)
77    perror ("pthread_attr_init failed");
78
79  tid = (pthread_t *) malloc (NTHREADS * sizeof (pthread_t));
80
81  acc_get_cuda_stream (1);
82
83  for (i = 0; i < NTHREADS; i++)
84    {
85      if (pthread_create (&tid[i], &attr, &test, (void *) (unsigned long) (i))
86	  != 0)
87	perror ("pthread_create failed");
88    }
89
90  if (pthread_attr_destroy (&attr) != 0)
91    perror ("pthread_attr_destroy failed");
92
93  for (i = 0; i < NTHREADS; i++)
94    {
95      void *res;
96
97      if (pthread_join (tid[i], &res) != 0)
98	perror ("pthread join failed");
99    }
100
101  for (i = 0; i < NTHREADS; i++)
102    {
103      if (acc_is_present (x[i], N) != 0)
104	abort ();
105    }
106
107  acc_shutdown (acc_device_nvidia);
108
109  return 0;
110}
111
112/* { dg-output "" } */
113