1 // RUN: %libomp-compile-and-run
11 #define streqls(s1, s2) (!strcmp(s1, s2))
13 #define check(condition) \
15 fprintf(stderr, "error: %s: %d: " STR(condition) "\n", __FILE__, \
23 #define getpid _getpid
27 #define gettid GetCurrentThreadId
28 #define my_gethostname(buf, sz) GetComputerNameA(buf, &(sz))
31 #include <sys/types.h>
32 #define my_gethostname(buf, sz) gethostname(buf, sz)
35 #define BUFFER_SIZE 256
39 char buf
[BUFFER_SIZE
];
40 size_t needed
= omp_capture_affinity(buf
, BUFFER_SIZE
, NULL
);
41 check(needed
< BUFFER_SIZE
);
42 n
= sscanf(buf
, "%d", &retval
);
49 char buf
[BUFFER_SIZE
];
50 size_t needed
= omp_capture_affinity(buf
, BUFFER_SIZE
, NULL
);
51 check(needed
< BUFFER_SIZE
);
55 void check_integer(const char* formats
[2], int(*func
)()) {
57 for (i
= 0; i
< 2; ++i
) {
58 omp_set_affinity_format(formats
[i
]);
59 #pragma omp parallel num_threads(8)
61 check(get_integer() == func());
62 #pragma omp parallel num_threads(3)
64 check(get_integer() == func());
66 check(get_integer() == func());
71 void check_nesting_level() {
72 // Check %{nesting_level} and %L
73 const char* formats
[2] = {"%{nesting_level}", "%L"};
74 check_integer(formats
, omp_get_level
);
77 void check_thread_num() {
78 // Check %{thread_num} and %n
79 const char* formats
[2] = {"%{thread_num}", "%n"};
80 check_integer(formats
, omp_get_thread_num
);
83 void check_num_threads() {
84 // Check %{num_threads} and %N
85 const char* formats
[2] = {"%{num_threads}", "%N"};
86 check_integer(formats
, omp_get_num_threads
);
89 int ancestor_helper() {
90 return omp_get_ancestor_thread_num(omp_get_level() - 1);
92 void check_ancestor_tnum() {
93 // Check %{ancestor_tnum} and %a
94 const char* formats
[2] = {"%{ancestor_tnum}", "%a"};
95 check_integer(formats
, ancestor_helper
);
98 int my_get_pid() { return (int)getpid(); }
99 void check_process_id() {
100 // Check %{process_id} and %P
101 const char* formats
[2] = {"%{process_id}", "%P"};
102 check_integer(formats
, my_get_pid
);
106 int my_get_tid() { return (int)gettid(); }
107 void check_native_thread_id() {
108 // Check %{native_thread_id} and %i
109 const char* formats[2] = {"%{native_thread_id}", "%i"};
110 check_integer(formats, my_get_tid);
116 int buffer_size
= 256;
117 const char* formats
[2] = {"%{host}", "%H"};
119 my_gethostname(hostname
, buffer_size
);
120 for (i
= 0; i
< 2; ++i
) {
121 omp_set_affinity_format(formats
[i
]);
122 #pragma omp parallel num_threads(8)
124 char* host
= get_string();
125 check(streqls(host
, hostname
));
131 void check_undefined() {
133 const char* formats
[2] = {"%{foobar}", "%X"};
134 for (i
= 0; i
< 2; ++i
) {
135 omp_set_affinity_format(formats
[i
]);
136 #pragma omp parallel num_threads(8)
138 char* undef
= get_string();
139 check(streqls(undef
, "undefined"));
145 int main(int argc
, char** argv
) {
147 check_nesting_level();
149 check_ancestor_tnum();
151 //check_native_thread_id();