| /* Test that all sections are touched. */ |
| |
| /* { dg-require-effective-target sync_int_long } */ |
| |
| #include <omp.h> |
| #include <string.h> |
| #include <assert.h> |
| #include "libgomp_g.h" |
| |
| |
| #define N 100 |
| static int data[N]; |
| static int NTHR; |
| |
| static void clean_data (void) |
| { |
| memset (data, -1, sizeof (data)); |
| } |
| |
| static void test_data (void) |
| { |
| int i; |
| |
| for (i = 0; i < N; ++i) |
| assert (data[i] != -1); |
| } |
| |
| static void set_data (unsigned i, int val) |
| { |
| int old; |
| assert (i >= 1 && i <= N); |
| old = __sync_lock_test_and_set (data+i-1, val); |
| assert (old == -1); |
| } |
| |
| |
| static void f_1 (void *dummy) |
| { |
| int iam = omp_get_thread_num (); |
| unsigned long s; |
| |
| for (s = GOMP_sections_start (N); s ; s = GOMP_sections_next ()) |
| set_data (s, iam); |
| GOMP_sections_end (); |
| } |
| |
| static void test_1 (void) |
| { |
| clean_data (); |
| GOMP_parallel_start (f_1, NULL, NTHR); |
| f_1 (NULL); |
| GOMP_parallel_end (); |
| test_data (); |
| } |
| |
| static void f_2 (void *dummy) |
| { |
| int iam = omp_get_thread_num (); |
| unsigned s; |
| |
| while ((s = GOMP_sections_next ())) |
| set_data (s, iam); |
| GOMP_sections_end_nowait (); |
| } |
| |
| static void test_2 (void) |
| { |
| clean_data (); |
| GOMP_parallel_sections_start (f_2, NULL, NTHR, N); |
| f_2 (NULL); |
| GOMP_parallel_end (); |
| test_data (); |
| } |
| |
| int main() |
| { |
| omp_set_dynamic (0); |
| |
| NTHR = 4; |
| |
| test_1 (); |
| test_2 (); |
| |
| return 0; |
| } |