Set num_threads to 50 on 32-bit hppa in two libgomp loop tests
[official-gcc.git] / libgomp / testsuite / libgomp.oacc-c-c++-common / mdc-refcount-2.c
blob2431a76a805c6f230689b30a75f4239561c9637e
1 /* Verify that OpenACC 'attach'/'detach' doesn't interfere with reference
2 counting. */
4 #include <assert.h>
5 #include <stdlib.h>
6 #include <openacc.h>
8 /* Need to shared this (and, in particular, implicit '&data_work' in
9 'attach'/'detach' clauses) between 'test' and 'test_'. */
10 static unsigned char *data_work;
12 static void test_(unsigned variant,
13 unsigned char *data,
14 void *data_d)
16 assert(acc_is_present(&data_work, sizeof data_work));
17 assert(data_work == data);
19 acc_update_self(&data_work, sizeof data_work);
20 assert(data_work == data);
22 if (variant & 1)
24 #pragma acc enter data attach(data_work)
26 else
27 acc_attach((void **) &data_work);
28 acc_update_self(&data_work, sizeof data_work);
29 assert(data_work == data_d);
31 if (variant & 4)
33 if (variant & 2)
34 { // attach some more
35 data_work = data;
36 acc_attach((void **) &data_work);
37 #pragma acc enter data attach(data_work)
38 acc_attach((void **) &data_work);
39 #pragma acc enter data attach(data_work)
40 #pragma acc enter data attach(data_work)
41 #pragma acc enter data attach(data_work)
42 acc_attach((void **) &data_work);
43 acc_attach((void **) &data_work);
44 #pragma acc enter data attach(data_work)
46 else
49 else
50 { // detach
51 data_work = data;
52 if (variant & 2)
54 #pragma acc exit data detach(data_work)
56 else
57 acc_detach((void **) &data_work);
58 acc_update_self(&data_work, sizeof data_work);
59 assert(data_work == data);
61 // now not attached anymore
63 #if 0
64 if (TODO)
66 acc_detach(&data_work); //TODO PR95203 "libgomp: attach count underflow"
67 acc_update_self(&data_work, sizeof data_work);
68 assert(data_work == data);
70 #endif
73 assert(acc_is_present(&data_work, sizeof data_work));
76 static void test(unsigned variant)
78 const int size = sizeof (void *);
79 unsigned char *data = (unsigned char *) malloc(size);
80 assert(data);
81 void *data_d = acc_create(data, size);
82 assert(data_d);
83 assert(acc_is_present(data, size));
85 data_work = data;
87 if (variant & 8)
89 #pragma acc data copyin(data_work)
90 test_(variant, data, data_d);
92 else
94 acc_copyin(&data_work, sizeof data_work);
95 test_(variant, data, data_d);
96 acc_delete(&data_work, sizeof data_work);
98 #if ACC_MEM_SHARED
99 assert(acc_is_present(&data_work, sizeof data_work));
100 #else
101 assert(!acc_is_present(&data_work, sizeof data_work));
102 #endif
103 data_work = NULL;
105 assert(acc_is_present(data, size));
106 acc_delete(data, size);
107 data_d = NULL;
108 #if ACC_MEM_SHARED
109 assert(acc_is_present(data, size));
110 #else
111 assert(!acc_is_present(data, size));
112 #endif
113 free(data);
114 data = NULL;
117 int main()
119 for (size_t i = 0; i < 16; ++i)
120 test(i);
122 return 0;